1. 背景
Android开发APP Native时候,常会遇到大量数据交互,包含且不限于多变量,多数组,多字符串等。在数据量很多情况下,如果要针对某个数据封装native接口,则需要封装很多个,不便于管理以及维护且存在数据配置的时序问题。
对此通过传输对象即可解决上述问题。
1). 数据通过反序列化后送到Jni接口配置C++ native
2). 配置class,将更新后的class数据送到Jni接口配置C++ native
2. 场景
//TODO
3. 应用
如何使用?
3.1 Class定义
举一反三,当前只拿int、short、int[]、short[]举例。
package com.auto.test;
/**
* @author Tim
* @description: JNI对象传输测试
* @date :2023/04/13 9:19
*/
public class Test{
private int IntValue=0;
private short ShortValue = 0;
private int[] IntArray = new int[16];
private short[] ShortArray = new short[16];
public void setIntValue(int intvalue){
this.IntValue = intvalue;
}
public void setShortValue(int shortValue){
this.ShortValue = shortValue ;
}
public void setIntArray(int[] intArray){
System.arraycopy(intArray ,0,IntArray ,0,intArray.length);
}
public void setIntArray(int[] shortArray){
System.arraycopy(shortArray ,0,ShortArray,0,shortArray.length);
}
public int getIntValue(){
return this.IntValue;
}
public short getShortValue(){
return this.ShortValue;
}
public int[] getIntArray (){
return this.IntArray;
}
public short[] getShortArray(){
return this.ShortArray;
}
}
3.2 JNI接口
JNIEXPORT void JNICALL
Java_com_auto_test_JniNative_updateObject(JNIEnv *env, jobject thiz,jobject obj_variable) {
jclass variable_cls = env->GetObjectClass(obj_variable); //或得Test类引用
if (variable_cls == NULL) {
LOGE("variable_cls is null");
}
/**
* 变量-对象的实例字段
*/
jfieldID ShortValueFieldID = env->GetFieldID(variable_cls,"IntValue","I");
jfieldID ShortValueFieldID = env->GetFieldID(variable_cls,"ShortValue ","I");
/**
* 数组-对象的实例字段
*/
jfieldID IntArrayFieldID = env->GetFieldID(variable_cls,"IntArray","[I");
jfieldID ShortArrayFieldID = env->GetFieldID(variable_cls,"ShortArray ","[I");
/**
* 获取对象实例数据
*/
jint j_IntValue = env->GetIntField(obj_variable , ShortValueFieldID);
jshort j_IntValue = env->GetShortField(obj_variable , ShortValueFieldID);
jintArray IntArray = (jintArray)(env->GetObjectField(obj_variable,IntArrayFieldID));
jshortArray ShortArray = (jshortArray)(env->GetObjectField(obj_variable,ShortArrayFieldID));
//数组数据
jint *j_IntArray = env->GetIntArrayElements(IntArray,NULL);
jshort *j_ShortArray = env->GetShortArrayElements(ShortArray,NULL);
/**
* 数组数据长度
*/
int j_IntArray_len = env->GetArrayLength(IntArray);
int j_ShortArray_len = env->GetArrayLength(ShortArray);
//TODO
/**
* 调用了Get*Elements 接口,需要处理内存释放
*/
env->ReleaseIntArrayElements(IntArray,j_IntArray,JNI_ABORT);//JNI_ABORT 不拷贝数组内容,只释放内存。
env->ReleaseShortArrayElements(ShortArray,j_ShortArray,JNI_ABORT);
}
3.3 调用:
private Test mTest = new Test();
updateObject(mTest );
4. 结果
//TODO