Java JNI在windows下调用原生方法的dll的坑

jni开发调用几个步骤:

  1. 编写java文件,文件中包含java原生方法,并使用System.loadLibrary("test")加载原生实现库。
  2. 执行javac生成class文件,执行javah生成原生方法对应的.h头文件。
  3. 导入.h头文件到C/C++开发工具,编写.c/.cpp文件具体方法实现。
  4. 在不同系统下编译.c/.cpp文件,生成(windows下:.dll,linux下:.so,Mac下:.dylib)动态库文件。
  5. java 命令执行class文件。

java文件中引入原生动态库:

System.loadLibrary("synchronizer");

 在 java 中引用时,不能带上 lib和 .so

linux下jni 原生库:

生成文件:

 生成的 .so,注意命名规则 libXXX.so,lib 和 .so 不能省略。

执行调用成功。

windows下jni远程库:

生成文件为:

执行失败!

debug:

Windows 去找动态库的时候,并没有lib前缀!

去掉dll文件的lib前缀 

执行成功!

 以上,不同操作系统有差别。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用 JNI 调用 Windows API 的示例代码: 首先,我们需要编写一个 C 文件,实现我们需要调用Windows API 函数,并将其编译成 DLL。例如,我们需要调用 MessageBoxA 函数,可以编写以下代码: ``` #include <windows.h> #include <stdio.h> #include "jni.h" JNIEXPORT void JNICALL Java_com_example_MessageBox_messageBox(JNIEnv* env, jobject obj, jstring message) { const char* utfMessage = (*env)->GetStringUTFChars(env, message, NULL); MessageBoxA(NULL, utfMessage, "Message", MB_OK | MB_ICONINFORMATION); (*env)->ReleaseStringUTFChars(env, message, utfMessage); } ``` 这个函数接受一个字符串参数,调用 Windows API 的 MessageBoxA 函数,并显示消息框。 接下来,我们需要将这个 C 文件编译成 DLL。这里使用 MinGW-w64 编译器,可以使用以下命令: ``` x86_64-w64-mingw32-gcc -shared -o MessageBox.dll MessageBox.c ``` 这将生成一个名为 MessageBox.dllDLL 文件。 现在,我们可以在 Java 中使用 JNI 调用这个 DLL。首先,我们需要加载这个 DLL: ``` System.loadLibrary("MessageBox"); ``` 然后,我们可以调用这个 DLL 中的函数: ``` public class MessageBox { static { System.loadLibrary("MessageBox"); } public static native void messageBox(String message); public static void main(String[] args) { MessageBox.messageBox("Hello from JNI!"); } } ``` 这个 Java 类中包含一个名为 messageBox 的本地方法,它调用了我们刚刚编写的 C 函数。在 main 方法中,我们调用这个本地方法,传入一个字符串参数,这个字符串将被显示在消息框中。 这样,我们就完成了使用 JNI 调用 Windows API 的示例。需要注意的是,这个示例中使用了 MinGW-w64 编译器,如果使用其他编译器,可能需要进行相应的调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值