1. 程式人生 > >android呼叫第三方庫——第二篇——編寫庫android程式直接呼叫第三方庫libhello.so

android呼叫第三方庫——第二篇——編寫庫android程式直接呼叫第三方庫libhello.so

0:前言

1:本文主要作為丙方android公司的身份來寫

2:作者有不對的地方,請指出,謝謝

1:場景:公司接到任務,說配合乙方C++公司開發android識別程式,專案佈置到專案經理,然後經理把任務交給你來做,你自然是先抱怨一番,活多錢少讓我這新人來幹,哎沒辦法啊,幹吧!

2:東西:乙方C++公司交給我的東西有

libhello.so庫檔案
com_hello_hello_HelloActivity.h標頭檔案(有可能沒有這個,我是死命要來的)
庫的介面說明文件
3:搞起:
  1. 看了看給的介面說明文件,哎呦,不錯哦,文件說明很詳細,裡面的函式介面定義的完美,而且他的庫定義符合jni的規範,不需要在新增什麼東西了,直接在android程式中呼叫就行,good啊
  2. 新建專案helloword2,在根目錄下新建libs/armeabi資料夾,然後把庫libhello.so放進去,然後重頭戲來了-》新建包com.hello.hello,原來的包叫com.hello.word,之所以這樣做,是我經歷了一個痛苦的過程總結出來的,他給的標頭檔案
    com_hello_hello_HelloActivity.h   //符合jni的規範,前面com_hello_hello是包名,後面HelloActivity是類名,注意在丙方這裡叫類名,在乙方那裡叫Activity的名字
    能夠看出來他的包結構,然後就建立一個和他一樣的包,在這個包中新建一個和他一樣的類,類中的方法按照jni規範能夠得出來是什麼,比如
    JNIEXPORT jstring JNICALL Java_com_hello_hello_HelloActivity_sayHello(JNIEnv *, jclass);//其中有一個方法是無引數函式sayHello
    結構如圖
  3. 類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(); // 第三方庫函式
      
    }

  4. 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();//例項化類方法直接呼叫
        }
    }
  5. 執行android程式,注意你寫的是android程式,不需要修改編譯選項,執行如圖,實驗證明,利用android直接呼叫庫是可以的