Jni :三维数组处理方法 ,以整形三维数组为例 C++实现
本文原创,转载请注明地址:http://www.cnblogs.com/baokang/p/4982846.html
关于Jni的基本使用方法,请参阅:Java 调用 C++ (Java 调用 dll)康哥手把手教你
关于Jni的调试,请参阅:Jni 调试 : eclipse + Vs 联合调试
不废话了,直接上代码
1.java native 接口
/** * 将三维数组src中的每一个元素平方,dst进行输出 * @param src 输入 * @param dst 输出 */ public native static void calThreeDimensional(int[][][] src,int[][][] dst);
2.Jni 接口实现
1 /* 2 * Class: com_bk_jnidemo_JniDemo 3 * Method: calThreeDimensional 4 * Signature: ([[[I[[[I)V 5 */ 6 JNIEXPORT void JNICALL Java_com_bk_jnidemo_JniDemo_calThreeDimensional(JNIEnv *env, jclass cls, jobjectArray src, jobjectArray dst) 7 { 8 int x,y,z; 9 jobjectArray src_xy,dst_xy; 10 jintArray src_x,dst_x; 11 jint temp; 12 jint *xSrcValues; 13 jint *xDstValues; 14 15 /*------------------------获取x,y,z三个维度数-----------------------*/ 16 src_xy=static_cast<jobjectArray>(env->GetObjectArrayElement(src,0)); 17 dst_xy=static_cast<jobjectArray>(env->GetObjectArrayElement(dst,0)); 18 19 src_x=static_cast<jintArray>(env->GetObjectArrayElement(src_xy,0)); 20 dst_x=static_cast<jintArray>(env->GetObjectArrayElement(dst_xy,0)); 21 22 z=env->GetArrayLength(src); 23 y=env->GetArrayLength(src_xy); 24 x=env->GetArrayLength(src_x); 25 26 /*------------------------三层循环处理-----------------------------*/ 27 for(int i=0;i<z;i++) 28 { 29 src_xy=static_cast<jobjectArray>(env->GetObjectArrayElement(src,i)); 30 dst_xy=static_cast<jobjectArray>(env->GetObjectArrayElement(dst,i)); 31 32 for(int j=0;j<y;j++) 33 { 34 src_x=static_cast<jintArray>(env->GetObjectArrayElement(src_xy,j)); 35 dst_x=static_cast<jintArray>(env->GetObjectArrayElement(dst_xy,j)); 36 37 xSrcValues=env->GetIntArrayElements(src_x,NULL); 38 xDstValues=env->GetIntArrayElements(dst_x,NULL); 39 for(int k=0;k<x;k++) 40 { 41 /*--------此处进行单个元素处理----------*/ 42 xDstValues[k]=xSrcValues[k]*xSrcValues[k]; 43 } 44 /*-------------------数据写回:x层---------------------*/ 45 env->ReleaseIntArrayElements(src_x,xSrcValues,JNI_ABORT); 46 env->ReleaseIntArrayElements(dst_x,xDstValues,0); 47 48 /*----------------数据写回:y层----------*/ 49 env->SetObjectArrayElement(dst_xy,j,dst_x); 50 } 51 /*---------------数据写回:z层---------*/ 52 env->SetObjectArrayElement(dst,i,dst_xy); 53 } 54 }