c++ - 如何在 C++ 类中使用 JNI registerNatives?

标签 c++ android class java-native-interface android-ndk

我有一个名为 androidGPS 的 C++ 类,带有公共(public)方法和变量。在这个类中,我使用 JNI 调用一些 java 代码。但是我卡在了 registerNatives 函数中。

我的 C++ 类有这个 void 方法:

void LocationChanged(JNIEnv* env, jobject object, jstring paramsString);

这样实现的:

void androidGPS::LocationChanged(JNIEnv*, jobject, jstring paramsString)
{
    const char * nativeString = currEnv->GetStringUTFChars(paramsString, 0);

    QString qstring(nativeString);
    QStringList res;
    res << qstring;
    emit newReadAvailable(res);
}

我尝试链接到的 Java 类具有以下方法:

public static native void sndonLocationChanged(String currLocation);

在调用注册 native 之前,我将 JNINativeMethods 声明为局部变量,例如:

JNINativeMethod methods[] =
{
    {
         "sndonLocationChanged",
         "(Ljava/lang/String;)V",
         (void *)&androidGPS::LocationChanged
    }
};

本地注册调用是这样的:

int numMethods;
    numMethods = sizeof(methods) / sizeof(methods[0]);
    if (currEnv->RegisterNatives(listenerClass, methods, numMethods) < 0)
    {
        if (currEnv->ExceptionOccurred())
        {
            classError = true;
            emit error("JNI--Error running RegisterNatives");
            stopGPSService();
            return false; //Return with error
        }
        else
        {
            emit error("JNI--Error running RegisterNatives");
            stopGPSService();
            return false; //Return with error
        }
    }

编译器给我警告:

warning: converting from 'void (androidGPS::)(JNIEnv, _jobject*, _jstring*)' to 'void*'

当我通过 JNI 调用类中的函数 sndonLocationChanged() 时,c++ 应用程序崩溃。我在 C++ 中看不到错误,但 Dalvik 不会生成错误。

我猜是因为我没有正确调用 registerNatives 或没有正确声明方法(因此出现警告)。

如果我将 LocationChanged 静态声明为:

static jboolean LocationChanged(JNIEnv* env, jobject object, jstring paramsString);

它没有失败,但我不能将 paramsString 传递给类成员!

知道如何解决这个问题吗?

非常感谢,

卡洛斯。

最佳答案

一种选择是,您为 Java 代码提供一种获取指向 native androidGPS 对象的指针并将其传递给非类函数 LocationChanged() 的方法,它会调用 androidGPS::LocationChanged()。

非静态 C++ 对象的回调是有问题的,通常使用静态辅助函数以及指向应调用回调的对象的指针或使用指向单例对象的静态指针来解决。

p>

关于c++ - 如何在 C++ 类中使用 JNI registerNatives?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6028345/

相关文章:

c++ - 流行的 (c++) "error: no matching function for call to ... ",虽然有一个踢

c++ - 简单 C++ 程序上的过程入口点错误

c++ - 将字符串对象附加到 Arduino 中的字符数组

C++。如何知道方法/变量的定义位置?或者如何询问编译器?

java - 如何使段落标签内的 anchor 标签可点击?

android - 无法解析从本地源模块构建的本地 AAR

android - 尝试在空对象引用上调用接口(interface)方法 'android.IInAppBillingService...

c++ - 从 HWND 确定 MFC 对象的类型

java - Java中的单例线程安全

c# - Datagridview 显示类名而不是属性