我有一个名为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 *)'to'void *'
当我通过JNI调用类中的函数sndonLocationChanged()时,c ++应用程序崩溃了。我无法在c ++中看到错误,但Dalvik不会产生错误。
我猜是因为我没有正确地调用registerNatives或者没有正确地声明方法(因此警告)。
如果我将LocationChanged静态声明为:
static jboolean LocationChanged(JNIEnv* env, jobject object, jstring paramsString);
它不会失败,但我无法将paramsString传递给类成员!
我知道如何解决这个问题?
非常感谢,
卡洛斯。
答案 0 :(得分:2)
一个选项是你给Java代码一个获取指向你的原生androidGPS对象的指针并将其传递给非类函数LocationChanged()的方法,它调用androidGPS :: LocationChanged()。
回调到非静态C ++对象是有问题的,通常使用静态辅助函数来解决,该函数与指向应该调用回调的对象的指针相结合,或者使用指向单例对象的静态指针。