天天看點

Android如何調用第三方SO庫

轉自: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一下再運作。