• 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 }
  • 相关阅读:
    代码转换为html显示
    subprocess实时获取结果和捕获错误
    centos7开放端口和防火墙设置
    Inside The C++ Object Model(一)
    知其所以然(以算法学习为例)
    sql语法
    DLL断点调试
    我的算法学习之路
    算法系列之一
    cocos2d-x游戏引擎核心(3.x)----事件分发机制之事件从(android,ios,desktop)系统传到cocos2dx的过程浅析
  • 原文地址:https://www.cnblogs.com/baokang/p/4982846.html
Copyright © 2020-2023  润新知