Android使用NDK---函数参数传递-基本类型和数组
參考鏈接:http://www.cnblogs.com/luxiaofeng54/archive/2011/08/19/2145486.html
數(shù)據(jù)傳輸可分為 基本數(shù)據(jù)類(lèi)型傳輸 和 引用數(shù)據(jù)類(lèi)型的傳輸 , 因?yàn)閿?shù)組傳輸也比較特別(其實(shí)數(shù)組也是引用類(lèi)型),所以這里也專(zhuān)門(mén)分出來(lái)講講。
一、主要流程
1、?基本數(shù)據(jù)類(lèi)型的傳輸
a)????????上層定義一個(gè)native的方法,需要一個(gè)int 參數(shù) ,返回一個(gè)int值
b)???????JNI 對(duì)應(yīng) 上層的方法 , 打印出? 上層 傳輸下來(lái)的 int數(shù)據(jù),并返回 int數(shù)據(jù)
c)????????上層 收到 native 方法 返回的 值,在UI中顯示出來(lái)
?
?
2、?數(shù)組的傳輸
a)????????上層定義一個(gè)native的方法,需要一個(gè)int數(shù)組,返回一個(gè)int數(shù)組
b)???????JNI 對(duì)應(yīng)上層的方法,取出上層傳遞數(shù)組中的數(shù)據(jù)處理和打印出來(lái),并存入新數(shù)組中,最后把該數(shù)組返回給 Java層
c)????????上層 收到 native返回的 數(shù)組,加工成字符串,在UI中顯示出來(lái)
二、使用代碼
java文件:
public native String careJuly();public native int careJulyIn(int showCode);public native int[] careJulyArray(int[] InCode);static {System.loadLibrary("feelJulyGpsMap");}cpp文件: #include <jni.h> #include <string.h> #include <android/log.h>JNIEnv* jniEnv;extern "C" jstring Java_com_example_feeljulygpsmap_FeelJulyActivity_careJuly(JNIEnv *env, jobject thiz) {return env->NewStringUTF( "Hello, July!" ); }extern "C" jint Java_com_example_feeljulygpsmap_FeelJulyActivity_careJulyIn(JNIEnv *env, jobject thiz,jint showCode) {//return env->NewStringUTF( "Hello, July!" );if(jniEnv == NULL) {jniEnv = env;}//獲取 Java 傳遞下來(lái) 數(shù)字__android_log_print(ANDROID_LOG_INFO, "JNIMsg", "Java -- > C JNI : num = %d",showCode);//返回 2 倍 的數(shù)字給 Javareturn showCode*2; }extern "C" jintArray Java_com_example_feeljulygpsmap_FeelJulyActivity_careJulyArray(JNIEnv *env, jobject thiz,jintArray InCode) {//return env->NewStringUTF( "Hello, July!" );if(jniEnv == NULL) {jniEnv = env;}if(InCode == NULL){return NULL;}//獲取 Java 傳遞下來(lái) 數(shù)組 的 長(zhǎng)度//jsize len = (*jniEnv)->GetArrayLength(jniEnv, InCode);jsize len = jniEnv->GetArrayLength( InCode);__android_log_print(ANDROID_LOG_INFO, "JNIMsg", "Java -- > C JNI : len = %d",len);if(len <= 0) {return NULL;}//新建一個(gè)長(zhǎng)度為len的jintArray數(shù)組//jintArray array = (*jniEnv)-> NewIntArray(jniEnv, len);jintArray array = env->NewIntArray(len);if(array == NULL) {return NULL;}// 把 Java 傳遞下來(lái)的數(shù)組 用 jint* 存起來(lái)//jint *body = (*env)->GetIntArrayElements(env,InCode, 0);jint *body = env->GetIntArrayElements(InCode, 0);jint i = 0;jint num[len];for (; i < len; i++) {num[i] = body[i] * 2;__android_log_print(ANDROID_LOG_INFO, "JNIMsg", "Java -- > C JNI : nums[%d] = %d",i,num[i]);}if(num == NULL){return NULL;}//給 需要返回的數(shù)組賦值//(*jniEnv)->SetIntArrayRegion(jniEnv,array, 0, len, num);jniEnv->SetIntArrayRegion(array, 0, len, num);return array; }
錯(cuò)誤提示:undefined?reference?to?`__android_log_print'
修改MK文件,添加:
LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llogLOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llogLOCAL_MODULE := feelJulyGpsMap LOCAL_SRC_FILES := feelJulyGpsMap.cppinclude $(BUILD_SHARED_LIBRARY)
三、UI設(shè)計(jì)代碼
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical" ><SurfaceViewandroid:id="@+id/camera_preview"android:layout_width="240dp"android:layout_height="160dp" /><Buttonandroid:id="@+id/save_pic"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Fly" /><Buttonandroid:layout_width="80dp"android:layout_height="wrap_content"android:text="計(jì)算"android:id="@+id/btn_calculate" /><Buttonandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:text="生成"android:id="@+id/btn_calculate_array" /><EditTextandroid:layout_width="60dp"android:layout_height="wrap_content"android:id="@+id/et_num" /><EditTextandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:id="@+id/et_array_num" /><TextViewandroid:layout_width="60dp"android:layout_height="wrap_content"android:id="@+id/tv_double_num"android:text="CalNum:" /><TextViewandroid:id="@+id/tv_array_double_num"android:layout_height="wrap_content"android:layout_width="fill_parent"android:text="CalArray:" /></LinearLayout>四、運(yùn)行結(jié)果
??????????????? ????????????
總結(jié)
以上是生活随笔為你收集整理的Android使用NDK---函数参数传递-基本类型和数组的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 剑盾御三家怎么获得
- 下一篇: Android测试写入文本Log