在window中jni调用报错
Exception in thread "main" java.lang.UnsatisfiedLinkError: TestJni.sayHello(Ljava/lang/String;)Ljava/lang/String;
at TestJni.sayHello(Native Method)
at TestJni.main(TestJni.java:12)
大概意思是找不到方法.网上给了几种解决方法
第1种方法:
gcc -Wl,--kill-at -shared -o jnihello.dll Native.c
这种方法生成不带@的函数声明
第2种方法:
gcc -Wl,--add-stdcall-alias -shared -o jnihello22.dll Native.c
这种方法会生成2个函数声明,一个是带@的 一个是不带@的。
第3种方法:
在你的本地方法的头文件中中的函数前面加上下划线,比如以前是
JNIEXPORT void JNICALL Java_TestNative_Hello (JNIEnv * , jobject );
现在改成
JNIEXPORT void JNICALL _Java_TestNative_Hello (JNIEnv * , jobject );
同时你的实现的cpp文件或者c文件里的函数头也要一致 前面有下划线。
-----------------------------------------------------------------------------------------
在cdt编译的时候默认指定了参数,这时候我们需要添加一些编译的参数,其中方法1和方法二需要我们
添加编译参数,如何添加切图如下
--kill-at 是我们添加的编译参数,最后编译日志
**** Rebuild of configuration Release for project test_jni_c++ ****
**** Internal Builder is used for build ****
g++ -ID:\MinGW\lib\gcc\mingw32\4.6.2\include\c++ -IC:\Program Files\Java\jdk1.6.0_21\include -IC:\Program Files\Java\jdk1.6.0_21\include\win32 -O3 -Wall -c -fmessage-length=0 -osrc\JNItest.o ..\src\JNItest.cpp
g++ -Xlinker --kill-at -shared -olibtest_jni_c++.dll src\JNItest.o
Build complete for project test_jni_c++
Time consumed: 349 ms.
最后再说明一点,在java加载动态链接库的时候可能找不到文件地址(我的链接库放在lib目录下),需要在java编译的时候添加上编译参数切图:
over.