Android-NDK/JNI

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

2021-03-22  本文已影响0人  itfitness

目录

相关文章

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

上一篇下一篇

猜你喜欢

热点阅读