美文网首页NDK-CMAKE
C++全局调用Java方法

C++全局调用Java方法

作者: 张俊峰0613 | 来源:发表于2019-01-04 09:48 被阅读12次

C++主线程调用Java方法

主要步骤

  • 1、根据jobject获取jclass(静态方法就不用这一步了),如:
jclass clz = env->GetObjectClass(jobj);
  • 2、获取jmethodid,如:
jmethodid  jmid = 
        env->GetMethodID(clz, "onError", "(ILjava/lang/String;)V")
  • 3、调用方法,如:
jenv->CallVoidMethod(jobj, jmid, code, jmsg)

C++子线程调用Java方法

在子线程中调用java方法却不能采用在主线程中调用的方式,因为调用java方法是要用JNIEnv去调用的,但是JNIEnv是线程相关的,子线程中不能直接使用创建线程的JNIEnv,所以需要JVM进程相关的,可以通过JVM来获取当前线程的JNIEnv,然后就可以调用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

/**
 * 构造方法,做初始化
 */
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

相关文章

  • C++子线程调用Java方法

    1. C++ 全局调用Java方法 之前讨论过,如何C++主线程中调用 Java 函数C++主线程调用Java方法...

  • C++主线程调用Java方法

    1. C++ 全局调用Java方法 1.1 C++主线程调用Java方法 在 Android C++多线程-创建子...

  • C++ 全局调用Java方法

    版权声明:本文为卫伟学习总结文章,转载请注明出处!一、C++主线程调用Java方法 根据jobject获取jcla...

  • C++全局调用Java方法

    C++主线程调用Java方法 主要步骤 1、根据jobject获取jclass(静态方法就不用这一步了),如: 2...

  • JNI--c/c++调用Java方法

    上次说到c/c++调用Java的变量,同样的c/c++也可以调用Java的方法 1.c/c++native方法调用...

  • Android 中 C++ 调用 Java, 以及 Java 调

    C++ 调用 Java的原理本质 通过C++中jniEnv的几个关键API实现在C++ 中调用 Java的方法: ...

  • JNI之路径初探---2

    上一篇博客写的是Java调用C、C++的例子,本篇就演示一下C、C++怎么调用Java的属性和方法。

  • JNI基本操作

    JNI(Java Native Interface) Java调用C/C++,C/C++调用Java的一套API ...

  • JNI开发极简教程

    JNI(Java Native Interface) Java调用C/C++,C/C++调用Java的一套API ...

  • C++子线程中调用java方法

    我们通常都是在C++主线程中调用java方法,很简单,但是在子线程中调用java方法却不能采用在主线程中调用的方式...

网友评论

    本文标题:C++全局调用Java方法

    本文链接:https://www.haomeiwen.com/subject/hfxhrqtx.html