許多成熟的C引擎要移植到Android 平台上使用 , 一般都會 提供 一些接口, 讓Android sdk 和 jdk 實作。
下文将會介紹 C 如何 通過 JNI 層調用 Java 的靜态和非靜态方法。
1、主要流程
1、 建立一個測試類TestProvider.java
a) 該類提供了2個方法
b) 一個靜态的方法,一個非靜态的方法
2、 JNI中建立Provider.c
a) 該檔案中需要把Java中的類TestProvider映射到C中
b) 把TestProvider的兩個方法映射到C中
c) 建立TestProvider 對象
d) 調用兩個方法
3、 Android 上層 調用 JNI層
4、 JNI層調用C層
5、 C 層調用 Java 方法
2、設計實作
1、界面設計如下:
老樣子,很搓,不過實用,嘿嘿
代碼不在這貼出了,有需要的兄弟直接到文章結束部分下載下傳。
2、 關鍵代碼說明
C中定義映射的類、方法、對象
jclass TestProvider;
jobject mTestProvider;
jmethodID getTime;
jmethodID sayHello;
C 中映射 類
TestProvider = (*jniEnv)->FindClass(jniEnv,"com/duicky/TestProvider");
C中建立對象
jmethodID construction_id = (*jniEnv)->GetMethodID(jniEnv, TestProvider,"<init>", "()V");
TestProvider mTestProvider = (*jniEnv)->NewObject(jniEnv, TestProvider,construction_id);
C 中映射方法
靜态:
getTime = (*jniEnv)->GetStaticMethodID(jniEnv, TestProvider, "getTime","()Ljava/lang/String;");
非靜态:
sayHello = (*jniEnv)->GetMethodID(jniEnv, TestProvider, "sayHello","(Ljava/lang/String;)V");
C 中調用 Java的 方法
靜态:
(*jniEnv)->CallStaticObjectMethod(jniEnv, TestProvider, getTime);
非靜态:
(*jniEnv)->CallVoidMethod(jniEnv, mTestProvider, sayHello,jstrMSG);
注意 GetXXXMethodID 和 CallXXXMethod 。
第一個XXX 表示的是映射方法的類型,如: 靜态 跟非靜态
第二個 XXX 表示 調用方法的傳回值 ,如:Void,Object,等等。(調用靜态方法的時候Call後面要加Static)
詳細 映射方法 和 調用方法 請參考 JNI 文檔 ,這個很重要 !
3、 Java 上層 關鍵代碼
TestProvider.Java 的兩個方法
?
|
4、 Android.mk 檔案 關鍵代碼
?
|
老樣子,不說了,你懂的。 如果不懂,嘎嘎,那就請點選Android.mk 檔案 簡介
5、 JNI檔案夾下檔案
Provider.h
?
|
Provider.c
?
|
CToJava.c
?
|
3、運作效果
1、點選 “C調用java靜态方法”按鈕
C成功調用了Java中的getTime 方法,通過C方法列印出上層調用得到的時間,并且上層成功吐司出調用資訊出來。
2、點選 “C調用java非靜态方法”按鈕
C成功調用了sayHello 方法, 并成功接收到 C 傳遞的參數,和 吐司出相對應的資訊
4、C調用Java注意點
a) C 映射java 方法時 對應的簽名
getTime = (*jniEnv)->GetStaticMethodID(jniEnv, TestProvider, "getTime","()Ljava/lang/String;");
故事情節還沒發展這麼快,下一章才會專門介紹下這個簽名的使用
b)映射方法的時候需要差別靜态和非靜态GetStaticMethodID,GetMethodID
c)調用的時候也需要區分CallStaticObjectMethod,CallVoidMethod 而且還需要區分傳回值類型
有不了解的兄弟請留言,個人技術有限,有講錯的地方請大牛們指出,講的不夠全面的請多多包涵,謝謝,
點選下載下傳源碼 C調用Java例子
本文出自 duicky 部落格 , 轉載請注明出處 http://www.cnblogs.com/luxiaofeng54/archive/2011/08/17/2142000.html