1. JAVA实现
OneKeyVideoExport.java
package com.example.jnibasetypedemo;
public class OneKeyVideoExport {
public int percent;
public int assaint_mode;
public int assaint_state;
}
JNI原生方法声明:
public native OneKeyVideoExport getOneKeyVideoExportObjectFromJNI();
JAVA调用C++原生方法
OneKeyVideoExport obj= getOneKeyVideoExportObjectFromJNI();
System.out.println("===> " +
"percent:"+obj.percent +" " +
"mode:"+ obj.assaint_mode+" " +
"state:"+obj.assaint_state);
输出:
2025-01-16 00:25:33.399 7622-7622 System.out com.example.jnibasetypedemo I ===> percent:90 mode:1 state:2
2025-01-16 00:26:30.431 7747-7747 System.out com.example.jnibasetypedemo I ===> percent:90 mode:1 state:2
2.C++实现
C++实现原生方法给JAVA调用
extern "C"
JNIEXPORT jobject JNICALL
Java_com_example_jnibasetypedemo_MainActivity_getOneKeyVideoExportObjectFromJNI(JNIEnv *env, jobject thiz) {
OneKeyVideoExport _one{0};
_one.percent=90;
_one.assaint_mode=1;
_one.assaint_state=2;
jclass clazz = env->FindClass("com/example/jnibasetypedemo/OneKeyVideoExport");
jmethodID constructor = env->GetMethodID(clazz, "<init>", "()V");
jobject jobj = env->NewObject(clazz, constructor);
// 注意:这里的jobj是一个局部引用,如果你需要全局引用,请使用
// jobject globalRef = env->NewGlobalRef(jobj);
jfieldID percent = env->GetFieldID(clazz, "percent", "I");
jfieldID assaint_mode = env->GetFieldID(clazz, "assaint_mode", "I");
jfieldID assaint_state = env->GetFieldID(clazz, "assaint_state", "I");
jobject OneKeyVideoExport_JavaObject = env->AllocObject(clazz);
env->SetIntField(OneKeyVideoExport_JavaObject, percent, _one.percent);
env->SetIntField(OneKeyVideoExport_JavaObject, assaint_mode, _one.assaint_mode);
env->SetIntField(OneKeyVideoExport_JavaObject, assaint_state, _one.assaint_state);
env->DeleteLocalRef(jobj);
//env->DeleteGlobalRef(globalRef);
env->DeleteLocalRef(clazz);
return OneKeyVideoExport_JavaObject;
}
3.完整示例地址:
https://github.com/tonyimax/JniBaseTypeDemo.git