安卓JNI 调用第三方库的时候 不能加载so文件


clipboard.png
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

Android eigen jni ndk

亚当·布雷德 9 years, 3 months ago

第一个问题:
从错误信息看,是.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?这个已经超出本问题的范围了。

anyuds answered 9 years, 3 months ago

解决了,MD,困扰了一天一夜!! @jk_v1 还有几个问题可以帮忙解决吗

我把so文件放在src/main/jinLibs 里面了,找了好多网页,尽然可以用!!!

还有就是那么libs文件,我都搞混了,
红色是自己生成的,蓝色是ndk-build生成的,黄色是最后加的,到底什么和什么关系啊

图片描述

来自东方的鸟 answered 9 years, 3 months ago

Your Answer