android jni 调用java_Android 基于NDK的JNI开发 C调用java和java调用C
首先,這里所要講的主要是C調(diào)用java的,因為這里網(wǎng)上也沒有一個詳細的資料,其次,我開發(fā)android應(yīng)用沒多久,其中java錯誤敬請諒解!
關(guān)于配置NDK環(huán)境問題應(yīng)該不用再贅述了,這個網(wǎng)上有很多,只要配置好能編譯JNI的本地示例程序就可以了。
(NDK-1.6版本)
一、
這里講一下如何自己寫JNI程序,網(wǎng)上很多都是講用javah自動生成,其實并沒有太多必要。首先進入android-ndk-1.6_r1\apps
復(fù)制hello-jni文件夾到app目錄下,更改名字為你想要的,這里就叫 test-jni,然后進入test-jni目錄
,用寫字板打開Application.mk
內(nèi)容改為
APP_PROJECT_PATH := $(call my-dir)/project
APP_MODULES????? := test-jni
保存關(guān)閉。再進入project\jni目錄打開?Android.mk
LOCAL_MODULE??? := hello-jni
LOCAL_SRC_FILES := hello-jni.c
這兩個更改為
LOCAL_MODULE??? := test-jniLOCAL_SRC_FILES := test-jni.c
同時把hello-jni.c改為test-jni.c 這樣,你可以使用make APP=test-jni -B命令去編譯你的jni了。
二、這里講一下如何手動寫jni代碼
接著上面創(chuàng)建出來的jni,編譯時可以通過,但無法使用,因為jni函數(shù)有一個函數(shù)名規(guī)范。打開test-jni.c 會看的
Java_com_example_hellojni_HelloJni_stringFromJNI 這個命名是有詳細規(guī)范的,Java_ 開頭 下面是你在java哪個類里面要使用,比如我要在com\example\hellojni下面的testjni類中使用,那就要命名為Java_com_example_hellojni_testjni_stringFromJNI。
然后是參數(shù)JNIEnv* env,jobject thiz ,這兩個是默認的參數(shù),第一個是java虛擬機,必須有,第二個可以不用,相當于當前類的對象的指針,也就是this。
里面內(nèi)容的寫法也有很多,無非是 一些標準C的處理了。這里要注意的是java那邊的 數(shù)組類型在這邊對應(yīng)的都是一個類的指針,比如byte[],在c這邊是JbyteArray,
要獲取數(shù)組的值要用
int len =(*env)->GetArrayLength(env,msg);
jbyte* elems =(*env)-> GetByteArrayElements(env,msg, 0);
(*env)->ReleaseByteArrayElements(env,msg, elems, 0);
三、重點:C調(diào)用java。
先講一下我理解的調(diào)用過程,c要先找到這個類,然后要有一個對象,然后在這個類的對象基礎(chǔ)上調(diào)用這個函數(shù)。
因此調(diào)用java函數(shù)首先要有類,然后函數(shù)ID,然后對象
cls = (*env)->FindClass(env,"com/example/hellojni/Ext_Graphics");
//獲取數(shù)組
mid = (*env)->GetMethodID(env,cls,"getCanvasBmpByte","()[B");?? //這里的最后一個參數(shù)是用javap -s -p 命令拿到的,很多文章有講過
msg = (jbyteArray)(*env)->CallObjectMethod(env,job, mid); //注意這里的第二個參數(shù)就是對象,意義就是你調(diào)用的是當前類的當前對象的這個方法,如果當前類沒有這個函數(shù)那就直接出錯了,如果你要在其他類里面調(diào)用這個方法,請把這個類的對象的引用做參數(shù)傳遞進來:
Java_com_example_hellojni_HelloJni_InitGraphics( JNIEnv* env,jobject thiz ,jobject job )//這個就是函數(shù)所在的對象
暫時就只有這些,具體不清楚請回我消息吧~我會解答的
發(fā)表于 @
2010年09月02日 15:16:00?| 評論( 3
)| 舉報|
總結(jié)
以上是生活随笔為你收集整理的android jni 调用java_Android 基于NDK的JNI开发 C调用java和java调用C的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jvm垃圾回收机制_干货|JVM垃圾回收
- 下一篇: oracle 作业已存在,ORA-316