嵌套类的 JNI 签名?

发布于 2024-07-16 09:28:37 字数 396 浏览 7 评论 0 原文

我正在尝试在WindowsXP上使用JNI,java版本:

java版本“1.6.0_13” Java(TM) SE 运行时环境(内部版本 1.6.0_13-b03) Java HotSpot(TM) 客户端 VM(版本 11.3-b02,混合模式,共享)

当尝试获取嵌套类的 jclass 时

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

第二行断言,同样的事情在 Linux 上运行正常,但 Java 版本略有不同(1.5...IIRC)。

我尝试过几种排列,例如

LA$B; AB 拉.B;

但无济于事。

任何建议将不胜感激。

马丁

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

尤怨 2024-07-23 09:28:37

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

问题是 Java->C++ JNI 调用可以找到类,但是如果你有纯 C++ 线程,使用 jvm->GetEnv / jvm->AttachCurrentThread ,该线程可以执行 JNI 操作,但由于某种原因不能执行 FindClass 操作。

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

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

OK, I had a similar experience on Native Android, env->FindClass() would not find a nested class with A$B syntax. I moved stuff around and it wouldn't find even a non-nested class.

What turned out to be the issue is that Java->C++ JNI call can find classes, but if you have pure C++ thread, with jvm->GetEnv / jvm->AttachCurrentThread, this thread can do JNI stuff but not FindClass for some reason.

So my suggestion is if you hit weird FindClass behavior on Android, try to move it to a Java stack (i.e Java calling native method), it might help. Note that you might need NewGlobalRef for the jclass esp if it would be used later from another thread.

P.S. A$B is the correct way to refer to nested classes.

岁月静好 2024-07-23 09:28:37

该问题似乎已在此帖子中得到解决。

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

以下是问题的解决方法:

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

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

Seems like the issue was resolved in this thread.

Update: Oracle moved the the forums, the new location is Signature for nested class?

Here's how the issue was resolved:

Ok, I've finally found the problem. The nested class is compiled into a separate java class object (A$B.class) - a bit unexpecte for C/C++ programmer. I haven't packeged the file thus the class was reported as 'not found'. Interesting it worked on Linux though. Thanks for your help!

Another hint from me: In case FindClass returns null don't just assert and guess. At the very least call env->ExceptionDescribe() to get a stacktrace on stderr. Better still, use env->ExceptionOccurred() to check for the Java exception being thrown, just like you would on any other Java method you call.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文