android呼叫第三方庫——第二篇——編寫庫android程式直接呼叫第三方庫libhello.so
阿新 • • 發佈:2019-01-08
0:前言
1:本文主要作為丙方android公司的身份來寫
2:作者有不對的地方,請指出,謝謝
1:場景:公司接到任務,說配合乙方C++公司開發android識別程式,專案佈置到專案經理,然後經理把任務交給你來做,你自然是先抱怨一番,活多錢少讓我這新人來幹,哎沒辦法啊,幹吧!
2:東西:乙方C++公司交給我的東西有
libhello.so庫檔案
com_hello_hello_HelloActivity.h標頭檔案(有可能沒有這個,我是死命要來的)
庫的介面說明文件
3:搞起:
- 看了看給的介面說明文件,哎呦,不錯哦,文件說明很詳細,裡面的函式介面定義的完美,而且他的庫定義符合jni的規範,不需要在新增什麼東西了,直接在android程式中呼叫就行,good啊
- 新建專案helloword2,在根目錄下新建libs/armeabi資料夾,然後把庫libhello.so放進去,然後重頭戲來了-》新建包com.hello.hello,原來的包叫com.hello.word,之所以這樣做,是我經歷了一個痛苦的過程總結出來的,他給的標頭檔案
能夠看出來他的包結構,然後就建立一個和他一樣的包,在這個包中新建一個和他一樣的類,類中的方法按照jni規範能夠得出來是什麼,比如com_hello_hello_HelloActivity.h //符合jni的規範,前面com_hello_hello是包名,後面HelloActivity是類名,注意在丙方這裡叫類名,在乙方那裡叫Activity的名字
結構如圖JNIEXPORT jstring JNICALL Java_com_hello_hello_HelloActivity_sayHello(JNIEnv *, jclass);//其中有一個方法是無引數函式sayHello
- 類HelloActiviry.java的程式碼
package com.hello.hello; import android.app.Activity; import android.app.AlertDialog; import android.os.Bundle; public class HelloActivity { // static // { // System.loadLibrary("hello"); //實驗證明在這裡不需要引入包名也是可以的 // } public static native String sayHello(); // 第三方庫函式 }
- android主程式Helloword2Acitiviry.java的程式碼
package com.hello.word; import com.hello.hello.HelloActivity; import android.app.Activity; import android.app.AlertDialog; import android.os.Bundle; public class Helloword2Activity extends Activity { static { System.loadLibrary("hello"); //引入包名 } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); new AlertDialog.Builder( this ).setMessage(new HelloActivity().sayHello()).show();//例項化類方法直接呼叫 } }
- 執行android程式,注意你寫的是android程式,不需要修改編譯選項,執行如圖,實驗證明,利用android直接呼叫庫是可以的