美文网首页Android-NDK/JNI
Android NDK开发:Native层实现数组的拷贝

Android NDK开发:Native层实现数组的拷贝

作者: itfitness | 来源:发表于2021-03-22 21:36 被阅读0次

    目录

    相关文章

    Android NDK开发:java调用dll动态链接库方法
    Android NDK开发:JNIEnv的原理
    Android NDK开发:C修改Java的属性
    Android NDK开发:C调用Java层方法
    Android NDK开发:C创建Java层的对象
    Android NDK开发:C操作Java层的数组
    Android NDK开发:Native层的变量管理及静态缓存
    Android NDK开发:Native层的异常处理
    Android NDK开发:结构体的偏移量及所占大小
    Android NDK开发:运算符重载与友元函数
    Android NDK开发:用C++手写一个简单的ArrayList

    实现意义

    使用C++实现数组的拷贝主要是为了提高程序运行的速度。

    代码展示

    C++代码:

    extern "C"
    JNIEXPORT void JNICALL
    Java_com_itfitness_arraycopy_MainActivity_arrayCopy(JNIEnv *env, jobject instance, jobject arraySrc,
                                                        jint srcPos, jobject arraDst, jint dstPos,
                                                        jint copyLength) {
        //1.先将源数组和目标数组转换成jobjectArray
        jobjectArray src_arr = reinterpret_cast<jobjectArray>(arraySrc);
        jobjectArray src_dst = reinterpret_cast<jobjectArray>(arraDst);
    
        //2.通过循环将源数组的值赋给目标数组
        for(int i = srcPos ; i < srcPos + copyLength ; i ++){
            jobject element = env->GetObjectArrayElement(src_arr,i);
            env->SetObjectArrayElement(src_dst,dstPos,element);
            dstPos++;
        }
    }
    

    Java代码:

    import androidx.appcompat.app.AppCompatActivity;
    
    import android.os.Bundle;
    import android.util.Log;
    import android.widget.TextView;
    
    public class MainActivity extends AppCompatActivity {
        static {
            System.loadLibrary("native-lib");
        }
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Student[] srcStus = new Student[10];
            //对源数组的赋值
            for(int i = 0 ; i < srcStus.length ; i ++){
                String name = "姓名:" + i;
                srcStus[i] = new Student(name ,i);
            }
            //创建目标数组
            Student[] dstStus = new Student[srcStus.length];
    
            //进行数组的拷贝
            arrayCopy(srcStus,0,dstStus,0,srcStus.length);
    
            //打印拷贝后的数组
            for (Student stu : dstStus) {
                Log.e("结果:",stu.toString());
            }
        }
        /**
         * 数组拷贝
         * @param arraySrc 源数组
         * @param srcPos 源数组开始拷贝的位置
         * @param arraDst 目标数组
         * @param dstPos 目标数组开始赋值的位置
         * @param copyLength 拷贝的长度
         */
        public native void arrayCopy(Object arraySrc,int srcPos,Object arraDst,int dstPos,int copyLength);
    }
    

    运行结果

    案例源码

    https://gitee.com/itfitness/ArrayCopy

    相关文章

      网友评论

        本文标题:Android NDK开发:Native层实现数组的拷贝

        本文链接:https://www.haomeiwen.com/subject/avvthltx.html