Android JNI程式設計學習
阿新 • • 發佈:2018-11-06
1、從java中傳遞過來一個二維陣列,JNI獲取到這個陣列的 行和列; 並且獲取到陣列內的值來計算;
JNIEXPORT jdouble Java_com_example_test1_MyJni_Eig(JNIEnv *env, jobject,
jobjectArray arrayData)
用 jobjectArray傳遞陣列,下面程式碼實現的是獲取到這個陣列的行和列
需要注意強制轉換,要不會報錯。下面程式碼是把值取出,jint row = env->GetArrayLength(arrayData); //行數 jarray myarray = (jobjectArray) env->GetObjectArrayElement(arrayData, 0); jint col = env->GetArrayLength(myarray); //得到列數
這裡面可以實現陣列的動態建立,例如jdouble[row][col];jdouble aa[row][col]; //取出資料從jobjectArray中 for (i = 0; i < row; i++) { myarray = (jobjectArray) env->GetObjectArrayElement(arrayData, i); jdouble *data = (*env).GetDoubleArrayElements((jdoubleArray) myarray, 0); for (j = 0; j < col; j++) { aa[i][j] = data[j]; //取出資料 } }
2、解析完傳遞過的二維陣列,然後可以進行建立一個二維陣列,用於返回
3、除錯JNI,用於日誌輸出,顯示在LOGCAT上。//開始構建陣列物件,用於返回; jobjectArray result; jclass doubleArr = env->FindClass("[D"); result = env->NewObjectArray(N, doubleArr, NULL); for (jint i = 0; i < n; i++) { jdouble tmp[2 * n]; jdoubleArray iarr = env->NewDoubleArray(2 * n); for (jint j = 0; j < 2 * n; j++) { if (vec[i][j] < 0.000001) if (vec[i][j] > -0.000001) vec[i][j] = 0.0; tmp[j] = vec[i][j]; } env->SetDoubleArrayRegion(iarr, 0, 2 * n, tmp); env->SetObjectArrayElement(result, i, iarr); env->DeleteLocalRef(iarr); }
包含進標頭檔案#include<android/log.h>
輸出用這條語句:
__android_log_print(ANDROID_LOG_INFO, "JNILog", "vec== %0.4f",
vec[i][j]);
裡面的引數:ANDROID_LOG_INFO:是日誌級別;"JNILog":是要過濾的標籤,可以在LogCat檢視中過濾。“vec==”,vec[i][j]:是實際的日誌內容。
同時還必須在Android.mk檔案中加入:LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog
4、