韌館-LearnHouse

[Android]JNI呼叫C/C++函式傳遞Int Array參數與返回Array值

上層Java呼叫C/C++的函式

public native void 2DArrayInput(int[][] inputData);
public native int[] returnArray(int[] inputData2);

二維int陣列傳值:

public final static int[][] inputData = {
                                       {0x0226,0x00}
                                      ,{0x0227,0x40}
                                      ,{0x0228,0x00}
                                    };
JniTest jnitest = new JniTest();
jnitest.2DArrayInput(inputData);


下層C/C++撰寫,轉換成JNI函式這裡我就不介紹,請參考-[Android]如何在AOSP下編譯JNI

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);
	}
}

一維int陣列傳值與陣列回傳:

int[] inputData2 = {0, 1, 2, 3, 4};
...(略)
jnitest.arrayInput(inputData2);

JNI層:

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;
}
2022年7 月 posted by admin in 程式&軟體 and have No Comments

Place your comment

Please fill your data and comment below.
名稱:
信箱:
網站:
您的評論: