C++全局調(diào)用Java方法

C++主線程調(diào)用Java方法

主要步驟

  • 1、根據(jù)jobject獲取jclass(靜態(tài)方法就不用這一步了),如:
jclass clz = env->GetObjectClass(jobj);
  • 2、獲取jmethodid,如:
jmethodid  jmid = 
        env->GetMethodID(clz, "onError", "(ILjava/lang/String;)V")
  • 3、調(diào)用方法,如:
jenv->CallVoidMethod(jobj, jmid, code, jmsg)

C++子線程調(diào)用Java方法

在子線程中調(diào)用java方法卻不能采用在主線程中調(diào)用的方式,因為調(diào)用java方法是要用JNIEnv去調(diào)用的,但是JNIEnv是線程相關(guān)的,子線程中不能直接使用創(chuàng)建線程的JNIEnv,所以需要JVM進(jìn)程相關(guān)的,可以通過JVM來獲取當(dāng)前線程的JNIEnv,然后就可以調(diào)用java方法了。

主要步驟

  • 1、獲取JVM對象
JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved);
  • 2、通過JVM對象獲取JNIEnv
JNIEnv *env;
jvm->AttachCurrentThread(&env,0);//拿到env
/**
 * Call Java Method
 */
jvm->DetachCurrentThread(); 

示例

JavaListener.h

class JavaListener {

public:
    JavaVM *jvm;
    jobject jobj;//類的對象
    _JNIEnv *jenv;
    jmethodID jmid;
public:
    JavaListener(JavaVM *vm,_JNIEnv *env,jobject obj);
    ~JavaListener();

    /**
     * threadType:
     *      1-主線程
     *      0-子線程
     */
    void onError(int threadType,int code, const char *msg);
};

JavaListener.cpp

/**
 * 構(gòu)造方法,做初始化
 */
JavaListener::JavaListener(JavaVM *vm, _JNIEnv *env, jobject obj) {
    jvm = vm;
    jobj = obj;
    jenv = env;
    jclass clazz = env->GetObjectClass(jobj);
    if (!clazz) {
        return ;
    }
    jmid =  env->GetMethodID(clazz,"onError","(ILjava/lang/String;)V");
}


void JavaListener::onError(int threadType, int code, const char *msg) {
    if (threadType == 1){//
        jstring jmsg = jenv->NewStringUTF(msg);
        jenv->CallVoidMethod(jobj,jmid,code,jmsg);
        jenv->DeleteLocalRef(jmsg);
    } else {
        JNIEnv *env;
        jvm->AttachCurrentThread(&env,0);//拿到env

        jstring jmsg = env->NewStringUTF(msg);
        env->CallVoidMethod(jobj,jmid,code,jmsg);
        env->DeleteLocalRef(jmsg);

        jvm->DetachCurrentThread();
    }
}

源碼地址:https://github.com/Xiaoben336/JniThread.git

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容