Android jni的一些记录

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值