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 }
原文地址:https://www.cnblogs.com/baokang/p/4982846.html