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 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]; //取出数据 } }这里面可以实现数组的动态创建,例如jdouble[row][col];
2、解析完传递过的二维数组,然后可以进行创建一个二维数组,用于返回
//开始构建数组对象,用于返回; 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); }3、调试JNI,用于日志输出,显示在LOGCAT上。
包含进头文件#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 -llog4、