Android使用NDK---函数参数传递-基本类型和数组
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                Android使用NDK---函数参数传递-基本类型和数组
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                參考鏈接:http://www.cnblogs.com/luxiaofeng54/archive/2011/08/19/2145486.html
 
 
數據傳輸可分為 基本數據類型傳輸 和 引用數據類型的傳輸 , 因為數組傳輸也比較特別(其實數組也是引用類型),所以這里也專門分出來講講。
一、主要流程
1、?基本數據類型的傳輸
a)????????上層定義一個native的方法,需要一個int 參數 ,返回一個int值
b)???????JNI 對應 上層的方法 , 打印出? 上層 傳輸下來的 int數據,并返回 int數據
c)????????上層 收到 native 方法 返回的 值,在UI中顯示出來
?
?
2、?數組的傳輸
a)????????上層定義一個native的方法,需要一個int數組,返回一個int數組
b)???????JNI 對應上層的方法,取出上層傳遞數組中的數據處理和打印出來,并存入新數組中,最后把該數組返回給 Java層
c)????????上層 收到 native返回的 數組,加工成字符串,在UI中顯示出來
二、使用代碼
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 傳遞下來 數字__android_log_print(ANDROID_LOG_INFO, "JNIMsg", "Java -- > C JNI : num = %d",showCode);//返回 2 倍 的數字給 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 傳遞下來 數組 的 長度//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;}//新建一個長度為len的jintArray數組//jintArray array = (*jniEnv)-> NewIntArray(jniEnv, len);jintArray array = env->NewIntArray(len);if(array == NULL) {return NULL;}// 把 Java 傳遞下來的數組 用 jint* 存起來//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;}//給 需要返回的數組賦值//(*jniEnv)->SetIntArrayRegion(jniEnv,array, 0, len, num);jniEnv->SetIntArrayRegion(array, 0, len, num);return array; }
錯誤提示: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設計代碼
<?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="計算"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>四、運行結果
 
??????????????? ???????????? 
 
 
總結
以上是生活随笔為你收集整理的Android使用NDK---函数参数传递-基本类型和数组的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 剑盾御三家怎么获得
- 下一篇: 33.哪些操作会引起页面回流(Reflo
