如何在 c++ 类中使用 JNI registerNatives
How to use JNI registerNatives inside c++ class?
我有一个名为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++对象的回调是有问题的,通常使用静态帮助程序函数与指向应调用回调的对象的指针或使用指向单一实例对象的静态指针来解决。
相关文章:
- 通过JNI传递数据数组的最快方法是什么
- 为 NewObjectA() 函数创建 jvalues 的参数数组时出错 - JNI Invocation API
- 将 C# DLL 导入 C++ 以用于 JNI
- 用C++包装 Java 库 (JNI)
- 如何通过 JNI 将 C 字符串表情符号传递给 Java
- JNI从Android调用C++方法
- JVM 如何执行 JNI
- React Native (Android):无法通过 JNI 在 jobject 中返回字符串
- 如何将字符串数组返回到 java JNI
- JNI 日期值转换问题,在C++中获取不同的长整型值
- JNI,使用两个 .so 文件时出错,其中一个文件需要另一个文件
- Winapi - SetWindowLongPtr in ShutdownBlockReason创建/销毁JNI本机代码
- 将预编译的 C 共享库与 JNI/NDK 结合使用
- JNI 在应用程序中检测到错误:在为 innerclass 调用 NewObject 时使用了无效的 jobject
- 使用 jni 将返回带有模板的对象的 Java 代码转换为 c++
- 无法将DefineClass(JNI)与Qt资源一起使用
- Android JNI RegisterNatives:对所有内容调用一次,或者每个函数调用一次
- 如何使JNI RegisterNatives调用Java函数具有C++实例范围
- JNI-我可以在不为本机插件调用System.loadLibrary的情况下使用RegisterNatives吗
- 如何在 c++ 类中使用 JNI registerNatives