为 JNI 编译 64 位 DLL

标签 c visual-c++ dll 64-bit java-native-interface

我想通过 JNI 在我的 Java 项目中包含一个 C 库。我编写了必要的 JNI 包装器代码,并使用 gcc 和 make 在 Linux 环境中对其进行了编译和测试。现在我需要编译它以生成 64 位 Windows DLL,但我无法编译它。

我下载了 Visual C++ Express 2010,并且一直在命令行上使用 cl.exe。在不知道有什么更好的方法的情况下,我只是调用了 cl.exe 并将我想要编译的所有文件作为参数。我收到各种错误:

Command line warning D9024: unrecognized source file type 'svm_jni.h'...

svm_jni.c(63) : error C2275: 'jobject' : illegal use of this type as an expression...

我发现的第一个问题是 cl.exe 不接受 .h 文件(我猜它只适用于 C++ 而不是 C?)。有解决方法吗?我可以将所有 .h 文件更改为 .c 文件并更改包含语句,但我不想这样做。

我曾尝试在 MinGW 上使用 make 和 gcc 进行编译,但它总是说它无法编译为 64 位目标。

我尝试过使用 makefile 项目类型通过 VC++ 做一些事情,但我无法弄清楚它是如何工作的。

有什么建议吗?

编辑:我从命令行参数中删除了 .h 文件,这解决了部分问题。我一直在用

-I "C:\Program Files\Java\jdk1.6.0_21\include" -I "C:\Program Files\Java\jdk1.6.0_21\include\win32"

获取 jni.h 和 jni_md.h。我还是得到了

svm_jni.c(63) : error C2275: 'jobject' : illegal use of this type as an expression
    C:\Program Files\Java\jdk1.6.0_21\include\jni.h(83) : see declaration of 'jobject'

然后是一堆语法和奇怪的错误。我假设所有错误都是常见问题的结果,但我不知道出了什么问题。

有 64 位版本的 jni_md.h 吗?我现在用的是\include\win32

最佳答案

您并不是真的想编译头文件,而是想在编译 c/c++ 文件时将它们包含在编译路径中。

对于jobject的问题,你需要包含位于%JAVA_HOME%\include目录下的jni头文件。

对于 Visual C++ Express,您是否下载了 64 位构建工具?当您声明 gcc 和 MinGW 无法编译为 64 位目标时,您得到的信息到底是什么?你有 minGW-w64 吗?

关于为 JNI 编译 64 位 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4326587/

相关文章:

c++ - 对象数组融合的通用函数

c++ - 截图 C++ directx 获取黑色图像

c++ - VC++ 将示例应用程序转换为 DLL

c# - 在 C# 中使用 DLL

c - K&R的atof代码说明

c++ - 在运行时加载 DLL

c++ - 在 std::string 上使用 _T

c - 无法同时播放两种声音

c - 任何将向 C 变量名称添加大小前缀(u8、u16 等)的程序或脚本

c# - 在 C# 应用程序的 DLL 中使用 CUDA