如何在 c++ 类中使用 JNI registerNatives

How to use JNI registerNatives inside c++ class?

本文关键字:JNI registerNatives c++      更新时间:2023-10-16

我有一个名为androidGPS的c ++类,带有公共方法和变量。在這個類型中,我使用 JNI 來調自一些 java 代碼。但是我被困在注册本机功能中。

我的 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);

在调用寄存器本机之前,我将 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
        }
    }

编译器给我警告:

警告:从"无效"转换 (androidGPS::)(JNIEnv, _jobject*, _jstring*)' 到 'void*'

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

我猜是因为我没有正确调用注册本机或没有正确声明方法(因此发出警告)。

如果我将位置更改为静态声明为:

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

它不会失败,但我无法将参数字符串传递给类成员!

知道我该怎么解决这个问题吗?

非常感谢,

卡洛斯。

一种选择是给你的Java代码一个方法来获取指向原生androidGPS对象的指针,并将其传递给非类函数LocationChanged(),它调用androidGPS::LocationChanged()。

对非静态C++对象的回调是有问题的,通常使用静态帮助程序函数与指向应调用回调的对象的指针或使用指向单一实例对象的静态指针来解决。