`

JNI java.lang.UnsatisfiedLinkError

阅读更多

最近要用到JNI所以先练下手,因为项目是要在linux环境下开发,但是我自己的机子上环境还不全,所以就先用WINDOWS来测试了,其实原理和linux是差不多的。

因为之前有篇文章介绍了linux下的IDE 然后我还是喜欢eclipse 所以还是用的CDT这个插件,不过这次装插件遇到些小麻烦,之前测试装的是2.1.1 装上之后是可以用的,但是现在关了eclipse再启动就报错了,编辑器都打不开(C++的编辑器)。然后去了CDT官方才发现有针对eclipse3.4 的版本,看来我是土了,update site 是:

 

http://download.eclipse.org/tools/cdt/releases/ganymede

 

因为我的eclipse也是ganymede。这下算是装好了但是装的时间有些长,哎网速慢了。

 

接下来就是装什么MinGW ,然后就按照网上的例子写个helloWorld了,就是这么个helloWorld 害我搞一下午。

 

错误1: java.lang.Unsatisfie.lang.UnsatisfiedLinkError  no XXXXX in java.library.path

这个错误一般是找不到dll文件

 

执行下这个 可以看看  System.out.println(System.getProperty("java.library.path"));  其实就是我们设置的path 环境变量里的东西或者有其他系统的设置。(在windows cmd下 输入path 或者 set 都可以看)。看了这个以后你就知道这个dll或者so文件放哪里他是可以找到了,当然最简单的放这个java文件所在的目录了或者他上层目录,一般是和java  src目录同层目录就好了,你看下java.library.path 中有个点号(.) 就表明是当前工作目录的意思,所以肯定在工程目录下有个位置。这个错误一般比较好解决。

 

错误2:java.lang.UnsatisfiedLinkError: XXXclass.XXXmethod()

这个错误是 在这个dll里找不到方法的声明,(搞了一下午害我差点装VC了,还借用到了dll查看工具)

网上说是@符号的问题 ,解决方法是用gcc 编译的时候指定参数

第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文件里的函数头也要一致 前面有下划线。

 

如果你需要查看dll的导出函数声明可以用以下2个工具

1: dllexp

2:Anywhere PE Viewer

 

声明:转载的话请写转载地址 http://dikar.iteye.com/admin/blogs/382701

        这个解决方案只在windows下测试过 ,linux下同样错误是否适用未知。

 

 

 

分享到:
评论
7 楼 谷赛玉 2014-05-05  
第二种错误还有一种原因是参数类型不一致,比如声明函数中的jint类型,在实现中写成int了。我就是这种错误。
6 楼 真心等候 2014-04-21  
感谢楼主 ,第三种方法解决。
5 楼 huals 2012-08-23  
已解决,Wl
4 楼 huals 2012-08-23  
第二种错误,不行呀,三种方法……
3 楼 huals 2012-08-23  
fsdfdsfsdf
2 楼 dikar 2010-11-09  
你用第3种方式试试看。
1 楼 azrael6619 2010-11-09  
楼主,我的错误第二种,但是函数的命名好像没问题哦,能帮我看看吗?可以的话加我:183659044

相关推荐

    c++ mk文件出错Jni调用产生java.lang.UnsatisfiedLinkError错误解决方法

    错误为: Android.mk文件 c++的调用方法为: 代码如下:LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := TestNdk ...include $(BUILD_SHARED_LIBRARY) ...另一个使用变量的方法,一直成功运行 ...

    jniLibs.zip

    提供了 x32 x64下libzbar_os包 解决在5.0的手机上报java.lang.UnsatisfiedLinkError异常问题

    studio碰到问题:java.lang.UnsatisfiedLinkError解决办法

    studio中碰到的jni问题 最近在做supervideo,解析youku视频地址,是加过密处理,须要用对应的key去解析,获取对应数据,在引用jni时,发现接二连三出问题,以前用eclipse时开发,直接把so文件放在libs/armeabi/下,...

    java调用JNI

    用java的JNI调用C++的dll包容详细的步骤和例子 附带源码 一步步的教你搭建,有兴趣的可以下载看看,包括源码、文档哟

    java调用Gmssl国密接口实例

    java调用Gmssl中国密接口进行对称与非对称加解密等运算,动态so库进行接口jni方式调用,采取接口形式对外暴露,方便对接系统调用相关java接口进行相关运算操作。

    ReLinker:适用于Android的强大本机库加载器

    java.lang.UnsatisfiedLinkError: Couldn't load stlport_shared from loader dalvik.system.PathClassLoader: findLibrary returned null at java.lang.Runtime.loadLibrary(Runtime.java:365) at java.lang....

    jni需要注意的常见问题

    jni 输入的问题; 找不到相应的库文件链接的问题java.lang.UnsatisfiedLinkError: no testjni1 in java.library.path ;Linux下编译下找不到库文件符号的问题libXXX.so: undefined symbol: _ZdlPv

    android studio 引入so

    android studio jni 开发 引用.so文件的正确使用方法主要解决: java.lang.UnsatisfiedLinkError: Couldn't load ***: findLibrary returned null 问题 android studio 2.0

    linker_patch.tar.gz

    RK3288 + Android 9.0 linker 补丁 解决APP无法直接加载/system/lib问题 java.lang.UnsatisfiedLinkError: dlopen failed: library

    Android Studio导入Eclipse项目时.so库文件的解决方法

    最近,将一个包含有百度地图SDK的Eclipse工程导入到Android Studio环境下时,运行进入App地图窗口出现了闪退,错误提示:java.lang.UnsatisfiedLinkError: No implementation found for long com.baidu.p……。...

    dll_export_viewer.rar

    曾经做过JNI的一个实验,总是提示java.lang.UnsatisfiedLinkError这样的错误,不是加载dll不成功,而是调用函数不成功,所以想看看dll中函数。用它吧。

Global site tag (gtag.js) - Google Analytics