`

(最终解决)java.lang.UnsatisfiedLinkError解决尝试

阅读更多

出现java.lang.UnsatisfiedLinkError: Couldn't load cbcencrypt-jni from loader dal,大多数可能是因为加载NDK库.so的时候,库缺失。而库缺失很有可能是NDK在build的时候因为不知名原因自动删掉了你的库文件。

 

我在解决这个问题的时候,尝试了很多办法,最后换了一个ndk,就正常了

 

附上NDK下载地址:

http://www.androiddevtools.cn/

注意:ndk11build的时候会报sh不到文件,需要添加进去ndk-build.cmd &find-win-host.cmd(附件下载)

会出现一个找不到路径的提示,但是仍可以build program成功。

 

事后发现不知道什么原因,原来我用的是MAC OS的NDK,添加进win的ndk-build.cmd然后可以跑,非常奇怪。。。绕过了NDK的build反而可以run了,为什么呢

在mac上,则需要把ndk-build.cmd改成ndk-build,覆盖掉原ndk-build,则也可以run成功

 

最终解决办法:

困扰了我一个月的问题,原来是这样的,后来我换了平台,换了同事最新的NDK,发现如下报错:

 

android ndk your app_build_script points to an unknown file ./jni/android.mk

 发现是NDK_PROJECT_PATH定义的路径问题,然后我参考如下文章:

http://blog.csdn.net/nodeathphoenix/article/details/7684230

发现了NDK_PROJECT_PATH是在build/core/build-local.mk里面定义的,然后更改路径为

 

E:\Java\NDK\2nd\android-ndk-r10\samples\cbcencrypt-jni

 

同时,最新的NDK/samples里面是多了最新的cbcencrypt-jni

 

[可以参考:http://blog.csdn.net/asmcvc/article/details/9311541

里面是如何生成.so文件的(application.mk里可以指定生成.so的类型,包括x86,mips等等)]

 

最后可以RUN成功了!!!

 

 

总结一下原理:

1.不配置NDK_PROJECT_PATH:

把c/c++文件放到工程的jni文件夹内

同时在Android.mk中添加如下

 

LOCAL_MODULE    := EdgeDetection
LOCAL_SRC_FILES := EdgeDetection.cpp

LOCAL_MODULE    := cbcencrypt-jni
LOCAL_SRC_FILES := cbcencrypt-jni.c

 则NDK在编译的时候会自动搜索项目中的c/c++文件进行编译。


这是不行的:因为后一个LOCAL_MODULE会覆盖掉上一个的,导致上一个.so被删除,只能有一个LOCAL_MODULE

 

2.不配置NDK_PROJECT_PATH:

如上文所说,更改core/build-local.mk,配置里面的NDK_PROJECT_PATH,指向c/c++文件所在路径即可

 

注意,如报错

target pattern contains no '%'

 可以把obj文件夹清掉即可

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics