Android中使用so文件:
做一個PDF閱讀的功能,找到一個開源的庫,mupdf。下載的是網上編譯好的so庫,導入到自己項目中的時候一直報錯Java.lang.UnsatisfiedLinkError: Couldn't load netplayerlibq: findLibrary returned null,找不到so文件中的方法。找了一個下午,終於知道了原因。
JNI中的方法的命名規范是
1) 前綴: Java_
2) 類的全限定名,用下划線進行分隔(_):com_lms_jni_JniTest
3) 方法名:getTestString
方法命名是與包名相關的,所以在用so庫的時候,將調用其中方法的類的包名改成so文件中寫的包名。這是最簡單的辦法。當然,最好的辦法當然是找到開源項目的源碼交叉編譯成含有我們項目包名的so文件。
參考http://blog.csdn.NET/jiabailong/article/details/7986350
Android studio中導入so的兩種方法:
1、將so文件放在libs目錄下,然后在app的build.gradle中加入如下配置
sourceSets { main { jniLibs.srcDirs = ['libs'] } }
整個配置文件如下:
android { compileSdkVersion 23 buildToolsVersion '19.1.0' defaultConfig { applicationId "com.hehe.itlms" minSdkVersion 15 targetSdkVersion 23 versionCode 1 versionName "1.0.0" } buildTypes { release { minifyEnabled true//是否混淆 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } sourceSets { main { jniLibs.srcDirs = ['libs'] } } }
2、將所有需要使用的.so文件壓縮為.zip文件(zip中的文件目錄結構為: lib/armeabi/*.so)注意,一定要是這樣的路徑,lib不要寫成libs啊!然后將這個.zip文件重命名為armeabi.jar文件(我用的是so.jar),將該jar包添加到項目的libs文件下,然后Add isLibrary。
最后的目錄結構
libs
^---|xxx.jar
^---|armeabi.jar
^---|lib
^---|armeabi
^---|xxx.so