0:前言html
1:本文主要做爲丙方android公司的身份來寫java
2:做者有不對的地方,請指出,謝謝
android
[第一篇:android利用jni調用第三方庫——編寫庫libhello.so]app
[第二篇:android利用jni調用第三方庫——編寫庫android程序直接調用第三方庫libhello.so]ide
[第三篇:android利用jni調用第三方庫——編寫庫android程序整合第三方庫libhello.so到本身的庫libhelloword.so]函數
1:場景:公司接到任務,說配合乙方C++公司開發android識別程序,項目佈置到項目經理,而後經理把任務交給你來作,你天然是先抱怨一番,活多錢少讓我這新人來幹,哎沒辦法啊,幹吧!ui
2:東西:乙方C++公司交給個人東西有this
libhello.so庫文件 com_hello_hello_HelloActivity.h頭文件(有可能沒有這個,我是死命要來的) 庫的接口說明文檔
3:搞起:spa
com_hello_hello_HelloActivity.h //符合jni的規範,前面com_hello_hello是包名,後面HelloActivity是類名,注意在丙方這裏叫類名,在乙方那裏叫Activity的名字可以看出來他的包結構,而後就創建一個和他同樣的包,在這個包中新建一個和他同樣的類,類中的方法按照jni規範可以得出來是什麼,好比
JNIEXPORT jstring JNICALL Java_com_hello_hello_HelloActivity_sayHello(JNIEnv *, jclass);//其中有一個方法是無參數函數sayHello結構如圖
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(); // 第三方庫函數
}
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();//實例化類方法直接調用 } }
4:下載demo[猛戳這裏下載demo]
.net