日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android jni 调用java_Android 基于NDK的JNI开发 C调用java和java调用C

發布時間:2024/7/23 Android 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android jni 调用java_Android 基于NDK的JNI开发 C调用java和java调用C 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

首先,這里所要講的主要是C調用java的,因為這里網上也沒有一個詳細的資料,其次,我開發android應用沒多久,其中java錯誤敬請諒解!

關于配置NDK環境問題應該不用再贅述了,這個網上有很多,只要配置好能編譯JNI的本地示例程序就可以了。

(NDK-1.6版本)

一、

這里講一下如何自己寫JNI程序,網上很多都是講用javah自動生成,其實并沒有太多必要。首先進入android-ndk-1.6_r1\apps

復制hello-jni文件夾到app目錄下,更改名字為你想要的,這里就叫 test-jni,然后進入test-jni目錄

,用寫字板打開Application.mk

內容改為

APP_PROJECT_PATH := $(call my-dir)/project

APP_MODULES????? := test-jni

保存關閉。再進入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代碼

接著上面創建出來的jni,編譯時可以通過,但無法使用,因為jni函數有一個函數名規范。打開test-jni.c 會看的

Java_com_example_hellojni_HelloJni_stringFromJNI 這個命名是有詳細規范的,Java_ 開頭 下面是你在java哪個類里面要使用,比如我要在com\example\hellojni下面的testjni類中使用,那就要命名為Java_com_example_hellojni_testjni_stringFromJNI。

然后是參數JNIEnv* env,jobject thiz ,這兩個是默認的參數,第一個是java虛擬機,必須有,第二個可以不用,相當于當前類的對象的指針,也就是this。

里面內容的寫法也有很多,無非是 一些標準C的處理了。這里要注意的是java那邊的 數組類型在這邊對應的都是一個類的指針,比如byte[],在c這邊是JbyteArray,

要獲取數組的值要用

int len =(*env)->GetArrayLength(env,msg);

jbyte* elems =(*env)-> GetByteArrayElements(env,msg, 0);

(*env)->ReleaseByteArrayElements(env,msg, elems, 0);

三、重點:C調用java。

先講一下我理解的調用過程,c要先找到這個類,然后要有一個對象,然后在這個類的對象基礎上調用這個函數。

因此調用java函數首先要有類,然后函數ID,然后對象

cls = (*env)->FindClass(env,"com/example/hellojni/Ext_Graphics");

//獲取數組

mid = (*env)->GetMethodID(env,cls,"getCanvasBmpByte","()[B");?? //這里的最后一個參數是用javap -s -p 命令拿到的,很多文章有講過

msg = (jbyteArray)(*env)->CallObjectMethod(env,job, mid); //注意這里的第二個參數就是對象,意義就是你調用的是當前類的當前對象的這個方法,如果當前類沒有這個函數那就直接出錯了,如果你要在其他類里面調用這個方法,請把這個類的對象的引用做參數傳遞進來:

Java_com_example_hellojni_HelloJni_InitGraphics( JNIEnv* env,jobject thiz ,jobject job )//這個就是函數所在的對象

暫時就只有這些,具體不清楚請回我消息吧~我會解答的

發表于 @

2010年09月02日 15:16:00?| 評論( 3

)| 舉報|

總結

以上是生活随笔為你收集整理的android jni 调用java_Android 基于NDK的JNI开发 C调用java和java调用C的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。