出现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,发现如下报错:
发现是NDK_PROJECT_PATH定义的路径问题,然后我参考如下文章:
发现了NDK_PROJECT_PATH是在build/core/build-local.mk里面定义的,然后更改路径为
同时,最新的NDK/samples里面是多了最新的cbcencrypt-jni
里面是如何生成.so文件的(application.mk里可以指定生成.so的类型,包括x86,mips等等)]
最后可以RUN成功了!!!
总结一下原理:
1.不配置NDK_PROJECT_PATH:
把c/c++文件放到工程的jni文件夹内
同时在Android.mk中添加如下
则NDK在编译的时候会自动搜索项目中的c/c++文件进行编译。
这是不行的:因为后一个LOCAL_MODULE会覆盖掉上一个的,导致上一个.so被删除,只能有一个LOCAL_MODULE
2.不配置NDK_PROJECT_PATH:
如上文所说,更改core/build-local.mk,配置里面的NDK_PROJECT_PATH,指向c/c++文件所在路径即可
注意,如报错
可以把obj文件夹清掉即可