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

歡迎訪問 生活随笔!

生活随笔

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

Android

【转】基于 Android NDK 的学习之旅-----数据传输(引用数据类型)

發(fā)布時間:2023/12/9 Android 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转】基于 Android NDK 的学习之旅-----数据传输(引用数据类型) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

原文網(wǎng)址:http://www.cnblogs.com/luxiaofeng54/archive/2011/08/20/2147086.html

基于 Android NDK 的學(xué)習(xí)之旅-----數(shù)據(jù)傳輸二(引用數(shù)據(jù)類型)(附源碼)

基于?Android NDK?的學(xué)習(xí)之旅-----數(shù)據(jù)傳輸(引用數(shù)據(jù)類型)

?

???????接著上篇文章繼續(xù)講。主要關(guān)于引用類型的數(shù)據(jù)傳輸,本文將介紹字符串傳輸和自定義對象的傳輸。

?

1、主要流程

1、??String?字符串傳輸

a)?????????上層定義一個native的方法,需要一個String??參數(shù)?,返回一個String

b)????????JNI對應(yīng)上層的方法,打印出上層傳輸下來的String數(shù)據(jù),并返回處理String數(shù)據(jù)

c)?????????上層?收到?native?方法?返回的?值,在UI中顯示出來

?

?

2、??自定義對象的傳輸

a)?????????自定義一個對象Person

b)????????上層定義一個native方法,參數(shù)Person,返回值Person

c)?????????JNI接收對象,打印出相關(guān)信息數(shù)據(jù)

d)????????JNI?修改Person?對象數(shù)據(jù),并返回到上層

e)?????????上層接收到數(shù)據(jù)后?在UI顯示出來

?

?

2設(shè)計實現(xiàn)

1、??界面設(shè)計如下:

?

?

老老樣子,很搓,嘿嘿

代碼不在這貼出了,有需要的兄弟直接到文章結(jié)束部分下載。

2、??關(guān)鍵代碼說明

?

Java?上層:

public?native?String transferString(String mStrMSG); public?native?Object? transferPerson(Person mPerson);?????

  

Person.java

package?com.duicky; /** ?* ?* ?* @author luxiaofeng <454162034@qq.com> ?* ?*/ public?class?Person { ????private?String name; ????private?int?age; ????public?Person() { ????????name = ""; ????????age = 0; ????} ????public?String getName() { ????????return?name; ????} ????public?void?setName(String name) { ????????this.name = name; ????} ????public?int?getAge() { ????????return?age; ????} ????public?void?setAge(int?age) { ????????this.age = age; ????} ????@Override ????public?String toString() { ????????return?"Person [name="?+ name + ", age="?+ age + "]"; ????} }

  

定義兩個native方法,?第一個是?用來?測試傳輸字符串的的,第二個是用來測試傳輸自定義對象的。

??????

???????Android.mk?文件

? ? ??

LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_C_INCLUDES := $(LOCAL_PATH)/include LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog LOCAL_MODULE??? := NDK_07 LOCAL_SRC_FILES := \ TransmissionPerson.c???? \ TransmissionString.c include $(BUILD_SHARED_LIBRARY)

?

  

?

老樣子,不說了,你懂的。?如果不懂,嘎嘎,那就請點擊Android.mk?文件?簡介咯

?

???????JNI?中間層

??????

???????TransmissionString.c????// String?傳輸

? ? ?

#include <string.h> #include <jni.h> #include <android/log.h> JNIEnv* jniEnv; //---------------------------------------------------------------- //---------------------------------------------------------------- //---------------------------------------------------------------- jstring Java_com_duicky_Transmission_transferString( JNIEnv* env,jobject thiz,jstring msg ) { ????if(jniEnv == NULL) { ????????jniEnv = env; ????} ????char?data[128]; ????memset(data, 0, sizeof(data)); ????char?*c_msg = NULL; ????c_msg = (char?*)(*jniEnv)->GetStringUTFChars(jniEnv, msg, 0); ????__android_log_print(ANDROID_LOG_INFO, "JNIMsg", "C JNI? ---- > %s",c_msg); ????return?(*jniEnv)->NewStringUTF(jniEnv, "This is send by C JNI"); }

?

  

?

?

TransmissionPerson.c //?自定義對象?傳輸

?

#include <string.h> #include <jni.h> #include <android/log.h> extern?JNIEnv* jniEnv; jclass Person; jobject mPerson; jmethodID getName; jmethodID setName; jmethodID getAge; jmethodID setAge; jmethodID toString; int?InitPerson(); void?ToString(); void?GetName(); void?GetAge(); void?SetName(); void?SetAge(); //---------------------------------------------------------------- //---------------------------------------------------------------- //---------------------------------------------------------------- jobject Java_com_duicky_Transmission_transferPerson( JNIEnv* env,jobject thiz,jobject person ) { ????if(jniEnv == NULL) { ????????jniEnv = env; ????} ????if?(Person == NULL || getName == NULL || setName == NULL || getAge == NULL ????????????|| setAge == NULL || toString == NULL) { ????????if?(1 != InitPerson()) { ????????????return?NULL; ????????} ????} ????mPerson =? person; ????if(mPerson == NULL) { ????????return?NULL; ????} ????GetName(); ????GetAge(); ????ToString(); ????__android_log_print(ANDROID_LOG_INFO, "JNIMsg", "Begin Modify mPerson? .... "?); ????SetName(); ????SetAge(); ????ToString(); ????return?mPerson; } //---------------------------------------------------------------- //---------------------------------------------------------------- //---------------------------------------------------------------- /** ?* 初始化 類、方法 ?*/ int?InitPerson() { ????__android_log_print(ANDROID_LOG_INFO, "JNIMsg", "InitPerson Begin? "?); ????if(jniEnv == NULL) { ????????return?0; ????} ????if(Person == NULL) { ????????Person = (*jniEnv)->FindClass(jniEnv,"com/duicky/Person"); ????????if(Person == NULL){ ????????????return?-1; ????????} ????????__android_log_print(ANDROID_LOG_INFO, "JNIMsg", "InitPerson Begin? 2 ok"?); ????} ????if?(getName == NULL) { ????????getName = (*jniEnv)->GetMethodID(jniEnv, Person, "getName","()Ljava/lang/String;"); ????????if?(getName == NULL) { ????????????(*jniEnv)->DeleteLocalRef(jniEnv, Person); ????????????return?-2; ????????} ????????__android_log_print(ANDROID_LOG_INFO, "JNIMsg", "InitPerson Begin? 4 ok"?); ????} ????if?(setName == NULL) { ????????setName = (*jniEnv)->GetMethodID(jniEnv, Person, "setName","(Ljava/lang/String;)V"); ????????if?(setName == NULL) { ????????????(*jniEnv)->DeleteLocalRef(jniEnv, Person); ????????????(*jniEnv)->DeleteLocalRef(jniEnv, getName); ????????????return?-2; ????????} ????????__android_log_print(ANDROID_LOG_INFO, "JNIMsg", "InitPerson Begin? 4 ok"?); ????} ????if?(getAge == NULL) { ????????getAge = (*jniEnv)->GetMethodID(jniEnv, Person, "getAge","()I"); ????????if?(getAge == NULL) { ????????????(*jniEnv)->DeleteLocalRef(jniEnv, Person); ????????????(*jniEnv)->DeleteLocalRef(jniEnv, getName); ????????????(*jniEnv)->DeleteLocalRef(jniEnv, setName); ????????????return?-2; ????????} ????????__android_log_print(ANDROID_LOG_INFO, "JNIMsg", "InitPerson Begin? 4 ok"?); ????} ????if?(setAge == NULL) { ????????setAge = (*jniEnv)->GetMethodID(jniEnv, Person, "setAge","(I)V"); ????????if?(setAge == NULL) { ????????????(*jniEnv)->DeleteLocalRef(jniEnv, Person); ????????????(*jniEnv)->DeleteLocalRef(jniEnv, getName); ????????????(*jniEnv)->DeleteLocalRef(jniEnv, setName); ????????????(*jniEnv)->DeleteLocalRef(jniEnv, getAge); ????????????return?-2; ????????} ????????__android_log_print(ANDROID_LOG_INFO, "JNIMsg", "InitPerson Begin? 4 ok"?); ????} ????if?(toString == NULL) { ????????toString = (*jniEnv)->GetMethodID(jniEnv, Person, "toString","()Ljava/lang/String;"); ????????if?(toString == NULL) { ????????????(*jniEnv)->DeleteLocalRef(jniEnv, Person); ????????????(*jniEnv)->DeleteLocalRef(jniEnv, getName); ????????????(*jniEnv)->DeleteLocalRef(jniEnv, setName); ????????????(*jniEnv)->DeleteLocalRef(jniEnv, getAge); ????????????(*jniEnv)->DeleteLocalRef(jniEnv, setAge); ????????????return?-2; ????????} ????????__android_log_print(ANDROID_LOG_INFO, "JNIMsg", "InitPerson Begin? 4 ok"?); ????} ????__android_log_print(ANDROID_LOG_INFO, "JNIMsg", "InitPerson End"?); ????return?1; } /** ?* GetName? 對應(yīng)Person的getName方法 ?*/ void?GetName() { ????if(Person == NULL || getName == NULL) { ????????if(1 != InitPerson()){ ????????????return; ????????} ????} ????jstring jstr = NULL; ????char* cstr = NULL; ????//調(diào)用方法 ????jstr = (*jniEnv)->CallObjectMethod(jniEnv, mPerson, getName); ????cstr = (char*) (*jniEnv)->GetStringUTFChars(jniEnv,jstr, 0); ????__android_log_print(ANDROID_LOG_INFO, "JNIMsg", "getName? ---- >? %s",cstr ); ????//釋放資源 ????(*jniEnv)->ReleaseStringUTFChars(jniEnv, jstr, cstr); ????(*jniEnv)->DeleteLocalRef(jniEnv, jstr); } /** ?* GetAge 對應(yīng)Person的getName方法 ?*/ void?GetAge() { ????if(Person == NULL || getName == NULL) { ????????if(1 != InitPerson()){ ????????????return; ????????} ????} ????//調(diào)用方法 ????jint age = (*jniEnv)->CallIntMethod(jniEnv, mPerson, getAge); ????__android_log_print(ANDROID_LOG_INFO, "JNIMsg", "getAge? ---- >? %d",age ); } /** ?* SetName 對應(yīng)Person的setName方法 ?*/ void?SetName() { ????if(Person == NULL || setName == NULL) { ????????if(1 != InitPerson()){ ????????????return; ????????} ????} ????jstring jstr = (*jniEnv)->NewStringUTF(jniEnv, "Modify Name"); ????//調(diào)用方法 ????(*jniEnv)->CallVoidMethod(jniEnv, mPerson, setName,jstr); ????(*jniEnv)->DeleteLocalRef(jniEnv, jstr); } int?age = 20; /** ?* SetAge 對應(yīng)Person的setAge方法 ?*/ void?SetAge() { ????if(Person == NULL || setAge == NULL) { ????????if(1 != InitPerson()){ ????????????return; ????????} ????} ????//調(diào)用方法 ????(*jniEnv)->CallVoidMethod(jniEnv, mPerson, setAge,age++); } /** ?* ToString 對應(yīng) Person 的 toString 方法 , 打印出相關(guān)信息 ?*/ void?ToString() { ????if(Person == NULL || toString == NULL) { ????????if(1 != InitPerson()){ ????????????return; ????????} ????} ????jstring jstr = NULL; ????char* cstr = NULL; ????//調(diào)用方法 ????jstr = (*jniEnv)->CallObjectMethod(jniEnv, mPerson, toString); ????cstr = (char*) (*jniEnv)->GetStringUTFChars(jniEnv,jstr, 0); ????__android_log_print(ANDROID_LOG_INFO, "JNIMsg", "C JNI toString? ---- >? %s",cstr ); ????(*jniEnv)->ReleaseStringUTFChars(jniEnv, jstr, cstr); ????(*jniEnv)->DeleteLocalRef(jniEnv, jstr); }

  

?

3、運行結(jié)果

A、測試?String傳輸?:?點擊?第一個按鈕,看UI顯示?和?LogCat?打印信息

?

1、??JNI?收到?Java?的信息

?

?

2、??Java?收到JNI?的信息

?

?

3、??UI?顯示信息

?

?

?

?

?

?

B、測試?自定義對象傳輸:點擊?第二個按鈕,看UI顯示?和?LogCat?打印信息

1、JNI?收到?Person?對象的?數(shù)據(jù)(Java?寫死了發(fā)送?name:duicky ,age:10)

???????

?

?

?

2、JNI?通過?setName,SetAge改變Person?后的數(shù)據(jù)

?

?

???????3、Java?上層?接收到的數(shù)據(jù)

???????

?

?

4、??UI?顯示信息

?

?

?

?

?

以上就是?Java --- JNI??String和?自定義對象?傳輸?shù)??小例子?,?其他?引用數(shù)據(jù)類型和Java自定義?都可以仿照上面的做法傳輸。

?

???????還有一種方式?:大數(shù)據(jù)傳輸可以通過保存到文件實現(xiàn)。如:上層保存數(shù)據(jù)到文件然后C JNI?層直接讀取文件?或者?C JNI?層保存數(shù)據(jù)到文件?由?上層讀取?。

?

?

有不理解的兄弟請留言,個人技術(shù)有限,有講錯的地方請大牛們指出,講的不夠全面的請多多包涵,謝謝,

?

點擊下載源碼?數(shù)據(jù)傳輸二

?

本文出自?duicky?博客?,?轉(zhuǎn)載請注明出處

http://www.cnblogs.com/luxiaofeng54/archive/2011/08/20/2147086.html

轉(zhuǎn)載于:https://www.cnblogs.com/wi100sh/p/5191376.html

總結(jié)

以上是生活随笔為你收集整理的【转】基于 Android NDK 的学习之旅-----数据传输(引用数据类型)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。