繁体   English   中英

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

[英]How to use JNI registerNatives inside c++ class?

我有一个名为androidGPS的c ++类,包含公共方法和变量。 在这个类中,我使用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);

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

编译器给我警告:

警告:从'void(androidGPS :: )(JNIEnv ,_jobject *,_ jstring *)'转换为'void *'

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

我想是因为我没有正确地调用registerNatives或者没有正确地声明方法(因此警告)。

如果我将LocationChanged static声明为:

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

它不会失败,但我无法将paramsString传递给类成员!

知道我该如何解决这个问题?

非常感谢,

卡洛斯。

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

回调到非静态C ++对象是有问题的,通常使用静态辅助函数来解决,该函数与指向应该调用回调的对象的指针相结合,或者使用指向单例对象的静态指针。

暂无
暂无

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

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