当前位置: 首页 > 知识库问答 >
问题:

加载JNI.dll,GCC编译成功,g++编译失败

冯元魁
2023-03-14

我有一个简单的JNI.dll,试图在测试Java应用程序中使用它。它是一个.c文件,由几个函数组成,头部由javah生成。(我正在使用MinGW btw编译)

如果我用GCC编译并链接这段代码,我就可以很好地用system.loadLibrary()加载.dll并使用它。但是,如果我用G++编译它,LoadLibrary()将失败,出现可怕的“UnsatisfiedLinkError”。

g++-wl,--add-stdcall-alias-i“C:\Program Files(x86)\Java\JDK1.7.0_45\Include”-i“C:\Program Files(x86)\Java\JDK1.7.0_45\Include\Win32”-shared-o testjni.dll testjni.c

有什么想法吗?我假设G++给函数命名的方式有些不同,但我不知道是什么...

共有1个答案

山森
2023-03-14

当编译为C++时,所有JNI导出的函数都需要extern“c”

 类似资料:
  • gcc 是 GNU 推出的功能强大、性能优越的多平台编译器,是 GNU 的代表作品之一。它能将C、C++语言源程序、汇编语言源程序和目标程序编译、链接成可执行文件,如果没有给出可执行文件的名字,gcc 将生成一个名为 a.out 的文件。 gcc 通过后缀来区分输入文件的类型: 后缀 类型 .c C语言源代码文件 .a 由目标文件构成的档案库文件 .C|.cc|.cxx C++源代码文件 .h 程

  • 补充clang++编译后的汇编代码: 编译结果:

  • 我使用vs代码,并且已经安装了“vs代码的Lombok注释支持”。我使用maven clear然后进行编译,结果编译失败。然后,当我尝试maven编译几秒钟后,它构建成功。我在两个maven编译之间没有执行任何操作。 我检查了错误消息,似乎Lombok注释不起作用。 当它成功的时候,我得到了信息 而我的pom.xml是 我想知道我应该把插件版本改成旧版本吗?但当我将其更改为3.1.0时,就会出现C

  • 在阅读了这篇漂亮的文章(预编译头的维护和输入)之后,我对这些在现实生活中如何实际工作产生了一些疑问。更具体地说,在以下场景中,我如何知道需要触发预编译头的重建: 我决定在我的一本书中定义一些东西。cpp文件,改变预处理器解释已包含在预编译头中的某些头的方式 预编译头的使用是否应该强制执行某种限制性的编码风格,比如将. cpp文件中包含的头的数量限制为一个,并且永远不要在. cpp文件中定义ing内

  • 前言 预处理 简述 打印出预处理之后的结果 在命令行定义宏 编译(翻译) 简述 语法检查 编译器优化 生成汇编语言文件 汇编 简述 生成目标代码 ELF 文件初次接触 ELF 文件的结构 三种不同类型 ELF 文件比较 ELF 主体:节区 汇编语言文件中的节区表述 链接 简述 可执行文件的段:节区重排 链接背后的故事 用 ld 完成链接过程 C++ 构造与析构:crtbegin.o 和 crten

  • 我试图在eclipse中用maven构建一个spark应用程序,但我遇到了一个编译失败。我修正了系统变量,给它提供到JDK的路径,而不是到JRE的路径,如下所示: 并且我将这个字符串添加到变量中,但是没有起作用。因此,我尝试不使用如下但没有新内容。 因此,我尝试通过eclipse来指出我的JDK,如下所示:,我也选择了JDK,但这个解决方案也不起作用,所以我决定使用cmd来修复它: 我检查了,结果