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