2013-03-28 68 views
2

我已經成功地將一個C++庫添加到了android 2.3.6源碼樹中。 現在我想包裝我的庫,以便從java中使用 我在網上搜索了很多關於這樣做的步驟,但幾乎所有我發現的例子都是你好世界的例子和簡單的例子...... 從這些例子我明白,我必須創建一個java文件,調用我需要的前綴本地的本地函數,然後生成頭文件並實現C++文件。使用jni包裝一個C++庫

但我不知道如何以這種方式調用我的庫函數。 這些標題和我的函數之間的連接是什麼? 我真的現在迷茫,我不知道怎麼就這麼開始 ,我會心存感激,如果有人能告訴我一步來包裝一個C++庫(已集成在AOSP)

回答

2

如果我明白你的問題:

假設你有一個C++庫,這種方法

int cPlusPlusMethod{ 
    // Your c++ implementation 
} 

基本上你需要做的是:

  1. 創建您需要的java方法

    native int javaMethod();

  2. 按照您在你爲了創建一個C++頭,你就會有類似發現的鏈接看到步驟:

    JNIEXPORT jint JNICALL Java_yourPackageName_yourJavaClass_javaMethod(JNIEnv的*);

  3. 現在你已經有了一個C++頭文件,並且包含了你需要的所有方法的聲明。編寫一個實現該頭文件的C++文件,並複製粘貼庫的C++實現。

JNIEXPORT jint JNICALL Java_yourPackageName_yourJavaClass_javaMethod(JNIEnv的* ENV){ //你的C++實現 }

(您必須包括所有必要的進口,把LIB的其他文件中的' jni'文件夾。)

從您的android項目根文件夾執行ndk-build,就是這樣。

也許這不是最聰明的方式來做到這一點,但至少對我來說它工作。 很顯然,如果你有庫源文件,如果你正在談論一個靜態庫,那麼我就不能幫你。

+0

非常感謝你的意思是編寫一個C++文件來實現這個頭文件並複製粘貼庫的C++實現 通過複製和註冊cc +代碼是或我必須將變量的類型更改爲jni類型(如jstring,...)? –

+1

我想你只能使用jni類型來傳遞給java本地方法的變量。對於所有其他方法(以及在方法中聲明的變量),您應該可以使用標準的c/C++類型。 也可以在這裏查看jni類型描述:http://docs.oracle.com /javase/1.5.0/docs/guide/jni/spec/types.html –