3

I'm trying to use JNI on WindowsXP, java version:

java version "1.6.0_13" Java(TM) SE Runtime Environment (build 1.6.0_13-b03) Java HotSpot(TM) Client VM (build 11.3-b02, mixed mode, sharing)

When trying to get jclass for a nested class

jclass c = env->FindClass ("A$B"); assert (c);

the second line asserts, The same thing works ok on Linux with slightly different version of Java (1.5... IIRC).

I've tried several permutations like

LA$B; A.B LA.B;

but to no avail.

Any advice will be highly appreciated.

Martin

4

2 回答 2

0

似乎问题已在此线程中解决。

更新: Oracle 移动了论坛,新位置是嵌套类的签名?

以下是问题的解决方法:

好的,我终于找到了问题所在。嵌套类被编译成一个单独的 java 类对象 (A$B.class) - 对于 C/C++ 程序员来说有点出乎意料。我没有打包文件,因此该类被报告为“未找到”。有趣的是它可以在 Linux 上运行。谢谢你的帮助!

我的另一个提示:如果FindClass返回 null 不要只是assert猜测。至少调用env->ExceptionDescribe()以获取堆栈跟踪stderr。更好的是,使用它env->ExceptionOccurred()来检查抛出的 Java 异常,就像您调用任何其他 Java 方法一样。

于 2009-04-13T16:26:32.340 回答
0

好的,我在 Native Android 上也有类似的经历,env->FindClass()找不到带有A$B语法的嵌套类。我移动了东西,它甚至找不到非嵌套类。

原来的问题是 Java->C++ JNI 调用可以找到类,但是如果你有纯 C++ 线程,那么jvm->GetEnv / jvm->AttachCurrentThread这个线程可以做 JNI 的东西,但FindClass由于某种原因不能。

所以我的建议是,如果您FindClass在 Android 上遇到奇怪的行为,请尝试将其移至 Java 堆栈(即 Java 调用本机方法),它可能会有所帮助。请注意,如果稍后从另一个线程中使用它,您可能需要 esp NewGlobalRefjclass

PSA$B是引用嵌套类的正确方法。

于 2021-12-23T07:57:44.297 回答