安卓JNI 调用第三方库的时候 不能加载so文件
so文件已经编译完成,好像就是不能调用,然后再app上也是闪退。
错误代码
08-20 10:50:26.094 32261-32261/com.jour.st.use_dsf E/AndroidRuntime﹕
FATAL EXCEPTION: main
Process: com.jour.st.use_dsf, PID: 32261
java.lang.UnsatisfiedLinkError: Couldn't load test from loader
dalvik.system.PathClassLoader[DexPathList[[zip file
"/data/app/com.jour.st.use_dsf-2.apk"],nativeLibraryDirectories=
findLibrary returned null
Answers
第一个问题:
从错误信息看,是.so文件找不到,load失败,还没到jni调用那一步。所以,确保你的.so文件已经放在libs目录下,并编译进了apk。你可以用压缩软件打开apk文件,看看里面是不是已经包含了.so文件。
把apk改名为zip打开也可以,不改直接unzip它或用图形压缩软件打开也可以,看里面的libs里有没有你说的libeigen.so。
另外,你的出错信息中说:
Couldn't load test from loader
貌似是Load一个叫libtest.so的库,而不是你说的eigen,请检查一下java中是不是这样的:
static {
System.loadLibrary("eigen");
}
这才是指定要加载libeigen.so,如果这个文件也在apk/libs下,应该是没问题的。
第二个问题:
使用Android studio的话,你直接把libxxxx.so放入jniLibs/armxxxxx/下就可以了,编译后就会自动帮你打包在apk里面,另外我看你app下有jni这个目录,应该是你自己创建的,这样在jni里执行了ndk-build后,会在app目录下产生两个临时文件夹libs和obj,这两个文件夹在Android Studio里面没用,因为Android studio不像eclipse那样把libs里的so打包到apk,而是默认使用了jniLibs目录。如果你非要让Android studio把app/libs的库打包到apk里,也是可以做到的,要自己编辑build.gradle文件来完成,怎么写build.gradle?这个已经超出本问题的范围了。