轉自:http://zwz94.blog.163.com/blog/static/3206039520131111101412959/
問題描述:Android如何調用第三方SO庫;
已知條件:SO庫為Android版本連接配接庫(*.so檔案),并提供了詳細的接口說明;
已了解解決方案:
1.将SO檔案直接放到libs/armeabi下,然後代碼中System.loadLibrary("xxx");再public native static int xxx_xxx_xxx();接下來就可以直接調用xxx_xxx_xxx()方法;
2.第二種方案,建立自己的SO檔案,在自己的SO檔案裡調用第三方SO,再在程式中調用自己的SO,這種比較複雜,需要建java類檔案,生成.h檔案,編寫C源檔案include之前生成的.h檔案并實作相應方法,最後用android NDK開發包中的ndk-build腳本生成對應的.so共享庫;
求解:
1.上面兩種方案是否可行?不可行的話存在什麼問題?
2.兩種方案有什麼差別?為什麼網上大部都是用的第二種方案?
3.隻有一個*.so檔案,并提供了詳細的接口說明,是否可在ANDROID中使用它?
首先要看這個SO是不是JNI規範的SO,比如有沒有傳回JNI不直接支援的類型。也就是說這個SO是不是可以直接當作JNI來調用。如果答案是否定的,你隻能選第二個方案。
如果答案是肯定的,還要看你是不是希望這個SO的庫直接暴露給JAVA層,如果答案是否定的,你隻能選第二個方案,比如你本身也是一個庫的提供者。
一般如果你隻有SO,就說明這個是别人提供給你的,你可以要求對方給你提供配套的JAVA調用檔案。
1、這個要看這個SO是不是符合JNI調用的規範。還要看你自己的意願。
2、因為第二種方法最靈活,各種情況都可以實作。
3、可以
看能不能直接從JAVA調用的最簡單的方法就是看SO裡的函數名是不是Java_XXX_XXX_XXX格式的
是就可以,你可以自己寫一個配套的JAVA檔案,注意一下SO函數名和JAVA函數名的轉換規則,或者向SO提供方索要;
不是的話就選第二種方案吧。
1、檢查所需檔案是否齊全 使用第三方動态庫,應該至少有2個檔案,一個是動态庫(.so),另一個是包含 動态庫API聲明的頭檔案(.h) 2、封裝原動态庫 原動态庫檔案不包含jni接口需要的資訊,是以我們需要對其進行封裝,是以我 們的需求是:将libadd.so 裡面的API封裝成帶jni接口的動态 3、編寫庫的封裝函數libaddjni.c 根據前面生成的com_android_libjni_LibJavaHeader.h 檔案,編寫libaddjni.c,用 來生成libaddjni.so
Android Studio Jni的so檔案放在jniLibs,Eclipse在libs目錄下。 so檔案位置更換後clean一下再運作。