上層Java呼叫C/C++的函式
[java]
public native void 2DArrayInput(int[][] inputData);
public native int[] returnArray(int[] inputData2);
[/java]

二維int陣列傳值:
[java]
public final static int[][] inputData = {
{0x0226,0x00}
,{0x0227,0x40}
,{0x0228,0x00}
};
JniTest jnitest = new JniTest();
jnitest.2DArrayInput(inputData);
[/java]

下層C/C++撰寫,轉換成JNI函式這裡我就不介紹,請參考-[Android]如何在AOSP下編譯JNI
[c]
JNIEXPORT void JNICALL Java_com_example_jni_JniTest_2DArrayInput (JNIEnv *env, jobject, jobjectArray inputData) {
int len = env->GetArrayLength(inputData);
jint qizi[len][2];
jobject datas;

for (int i = 0; i < len; i++) {
datas = (env->GetObjectArrayElement(inputData, i));
int num = env->GetArrayLength((jarray)datas);
jint *data = env->GetIntArrayElements((jintArray)datas, 0);
for (int j = 0; j < num; j++) {
qizi[i][j] = data[j];
ALOGD("Show data:%d", qizi[i][j]);
}
env->ReleaseIntArrayElements((jintArray)datas, data, 0);
}
}
[/c]

一維int陣列傳值與陣列回傳:
[java]
int[] inputData2 = {0, 1, 2, 3, 4};
…(略)
jnitest.arrayInput(inputData2);
[/java]
JNI層:
[c]
JNIEXPORT void JNICALL Java_com_arcadyan_jni_JniTest_returnArray (JNIEnv *env, jobject, jintArray array) {
jsize size = env->GetArrayLength(array);
jint *intArray= env->GetIntArrayElements(array, 0);
for (int i = 0; i < size; i++) {
intArray[i] += 1;
}
jintArray newIntArray = env->NewIntArray(size);
//把jint指標中的元素設定到jintArray物件中
env->SetIntArrayRegion(newIntArray, 0, size, intArray);
return newIntArray;
}
[/c]

Leave a comment

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *