03-Android JNI/Native数据传输策略之java class(对象Object)

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

猜你喜欢

转载自blog.csdn.net/liaochaoyun/article/details/130144854