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);
}