如何在c++;上课? 我有C++类,称为ANDROIDGPS,具有公共方法和变量。在这个类中,我使用JNI调用一些java代码。但我被困在注册函数中 我的C++类有这个空洞方法: void LocationChanged(JNIEnv* env, jobject object, jstring paramsString);

如何在c++;上课? 我有C++类,称为ANDROIDGPS,具有公共方法和变量。在这个类中,我使用JNI调用一些java代码。但我被困在注册函数中 我的C++类有这个空洞方法: void LocationChanged(JNIEnv* env, jobject object, jstring paramsString);,c++,android,class,java-native-interface,android-ndk,C++,Android,Class,Java Native Interface,Android Ndk,以这种方式实施: void androidGPS::LocationChanged(JNIEnv*, jobject, jstring paramsString) { const char * nativeString = currEnv->GetStringUTFChars(paramsString, 0); QString qstring(nativeString); QStringList res; res << qstring;

以这种方式实施:

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

    QString qstring(nativeString);
    QStringList res;
    res << qstring;
    emit newReadAvailable(res);
}
在调用register native之前,我将JNINATIVEMETHOLS声明为局部变量,如下所示:

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
        }
    }
它没有失败,但我不能将paramsString传递给类成员

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

非常感谢,


Carlos。

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


回调到非静态C++对象是有问题的,通常使用静态辅助函数来解决,它既可以使用指向回调对象的指针,也可以使用静态指针指向单个对象。你能提供一个简单的例子,“一个指向对象的指针”和“静态指针指向一个单独的”吗?在你的本机代码中,你有一个C++对象的实例化存储在某处…如果它是一个静态的(全局的),也许是“objecto;”,您可以只取它的地址,比如“&o”。如果它已经是一个动态分配,比如“Object*pO=newobject()”,那么pO已经是一个指针,所以您可以使用它。
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
        }
    }
static jboolean LocationChanged(JNIEnv* env, jobject object, jstring paramsString);