C++反调java,并设置JAVA成员变量
下面举例子简单说明
C++层代码
static struct {
jclass clazz;
jmethodID constructor;
}AUDIOINFO;
/**
初始化相关JNI对象
*/
void InitMediaClassInfo(JNIEnv*env) {
jclass audioInfoClazz = env->FindClass(
"com/My/jni/NativeExtractor$AudioExtraInfo");
AUDIOINFO.clazz = (jclass) env->NewGlobalRef(audioInfoClazz);
AUDIOINFO.constructor = env->GetMethodID(AUDIOINFO.clazz, "<init>", "(IIJ)V");
env->DeleteLocalRef(audioInfoClazz);
}
/**
调用
*/
extern "C"
JNIEXPORT void
JNICALL
Java_com_My_jni_NativeExtractor_nativeGetAudioExtraInfo(JNIEnv *env, jobject clazz, jobject obj, jlong context) {
FFExtractor *extractor = reinterpret_cast<FFExtractor*>(context);
if (!extractor) {
return;
}
uint8_t *pData = nullptr;
int64_t aDuration;
int sampleRate, channel, datalen;
extractor->getAudioInfo(sampleRate, channel, aDuration, &pData, datalen);
jobject javaMediaInfo = env->NewObject(AUDIOINFO.clazz, AUDIOINFO.constructor, (jint)sampleRate, (jint)channel, (jlong)aDuration);
env->SetObjectField(obj, NATIVEEXTRAINFO.audioInfo, javaMediaInfo);
env->DeleteLocalRef(javaMediaInfo);
}
java层代码:
public class NativeExtractor {
//被底层赋值
private AudioExtraInfo mAudioExtraInfo;
public static class AudioExtraInfo {
public int sampleRate;
public int channel;
public long duration;
AudioExtraInfo(int sampleRate, int channel, long duration) {
this.sampleRate = sampleRate;
this.channel = channel;
this.duration = duration;
}
}
public AudioExtraInfo getAudioExtraInfo() {
nativeGetAudioExtraInfo(this, mNativeContext);
return mAudioExtraInfo;
}
/**
获取对象,底层会反调java层设置mAudioExtraInfo
*/
private native void nativeGetAudioExtraInfo(NativeExtractor thiz, long context);
}
java调用C++,返回一个对象数组
/**
HighLightResult.java
*/
package com.My.jni.alg;
public class HighLightResult {
int Start;
int End;
public HighLightResult(int start, int end) {
this.Start = start;
this.End = end;
}
}
/**
NativeMediaClip.java
*/
public class NativeMediaClip {
public native HighLightResult[] nativeStartHighLightAlg(long timelineRef);
}
/**
C++代码
*/
extern "C"
JNIEXPORT jobjectArray JNICALL
Java_com_My_jni_NativeMediaClip_nativeStartHighLightAlg(JNIEnv *env, jclass clazz, jlong native_ref)
{
CVideoClipProxy VideoClipProxy(native_ref);
if (!VideoClipProxy.IsValid()) return nullptr;
HighLightResult result;
VideoClipProxy.StartHighLightAlg(result);
jobjectArray resultArray;
jclass hlResultClass = env->FindClass("com/My/jni/alg/HighLightResult");
jmethodID constructor = env->GetMethodID(hlResultClass, "<init>", "(II)V");
resultArray = env->NewObjectArray(result.mRangeVec.size(), hlResultClass, 0);
for(int i=0; i!=result.mRangeVec.size(); i++) {
jobject retObj = env->NewObject(hlResultClass, constructor, result.mRangeVec[i].start, result.mRangeVec[i].end);
env->SetObjectArrayElement(resultArray, i, retObj);
env->DeleteLocalRef(retObj);
}
env->DeleteLocalRef(hlResultClass);
return resultArray;
}