繁体   English   中英

使用C ++获取Java对象以调用Java方法

[英]Get Java object using C++ to call the Java method

我正在为Android开发本机代码和Java代码。

我计划基于C / C ++代码调用Java侦听器。 这个想法是C / C ++代码调用实际上调用Java侦听器的方法。

C / C ++代码如下。 我可以使用以下代码调用Java方法:第一个代码块是在JNI_OnLoad中初始化methodid和class

jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
    if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
        return -1;
    }

    jclass dataClass = env->FindClass("com/example/crowdlogic/NativeManager");
    dataClassHandle = (jclass)env->NewGlobalRef(dataClass);
    if (dataClassHandle == NULL) LOGI("dataClassHandle null");
    LOGI("init dataUpdateHandle");
    dataUpdateHandle = env->GetMethodID(dataClassHandle, "dataUpdate", "(I)V");
    if (dataUpdateHandle == NULL) LOGI("dataUpdateHandle null");

    return JNI_VERSION_1_6;
}

下一个代码块实际上正在调用它:

void sendCount(int totalCount) {
    jint jtotalCount = totalCount;
    jobject dataObjectHandle = env->NewObject(dataClassHandle, dataUpdateHandle);
    if (dataObjectHandle == NULL) LOGI("dataObjectHandle null");
    env->CallVoidMethod(dataObjectHandle, dataUpdateHandle, jtotalCount);
}

在Java部分中,dataUpdate方法实际上是被调用的,但是从不调用侦听器。 侦听器为null。 这是Java侦听器类

public class NativeManager {

    private static final String TAG = "crowdlogic:native_manager";

    // all the listener stuff below
    public interface Listener {
        public void onDataUpdated(int totalCount);
    }

    private Listener mListener = null;

    public void registerListener (Listener listener) {
        mListener = listener;
    }

    public void dataUpdate(int totalCount) { // call this from JNI in C++ class
        // now notify if someone is interested.
        Log.i(TAG, "Data update in Java called");
        if (mListener != null) {
        Log.i(TAG, "mListener not null");
        mListener.onDataUpdated(totalCount);
    }
    else
        Log.i(TAG, "mListener null"); // always come to this; the listener is null
    }
}

在我的主要活动中,我实例化了侦听器(在onCreate内部):

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...
    // start listener for data update
    mNativeMgr = new NativeManager();
    mNativeMgr.registerListener(this);
    mNativeMgr.dataUpdate(0);
    ...
}

我认为这是因为在本机部分中,我没有使用实例化的Java侦听器对象,而是实际上使用

jobject dataObjectHandle = env->NewObject(dataClassHandle, dataUpdateHandle);

内部void sendCount(int totalCount)。

我的问题是,如何在C / C ++代码中获取实例化的Java对象而不是创建一个新的Java对象? 谢谢大家,已经花了最后两天了...

我找到了解决方案。 我将Java方法设置为静态方法,而不是调用动态方法,而是使用CallStaticVoidMethod从C ++调用它。 代码示例:

jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
    if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
        return -1;
    }

    jclass dataClass = env->FindClass("com/example/crowdlogic/NativeManager");
    dataClassHandle = (jclass)env->NewGlobalRef(dataClass);
    dataUpdateHandle = env->GetStaticMethodID(dataClassHandle, "dataUpdate", "(I)V");
    return JNI_VERSION_1_6;
}

调用Java方法的本机函数:

void sendCount(int totalCount) {

jint jtotalCount = totalCount;
jobject dataObjectHandle = env->NewObject(dataClassHandle, dataUpdateHandle);
if (dataObjectHandle == NULL) LOGI("dataObjectHandle null");
LOGI("init CallVoidMethod");
env->CallStaticVoidMethod(dataClassHandle, dataUpdateHandle, jtotalCount);
}

在Java中,我将该方法声明为静态方法

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM