java - 为什么我的 JNI 代码没有成功找到 jthrowable 的 getMessage 方法?

标签 java exception-handling java-native-interface

我正在尝试访问 jthrowable 中的消息,同时处理找不到类时生成的异常。但是,我无法访问 jthrowable 对象上 getMessage() 的消息 ID,我也不知道为什么。我试过将 getMessage 的签名更改为“()Ljava/lang/String”(末尾没有分号,但这是必要的,对吧?)但没有任何乐趣。我对此一头雾水。我什至尝试用 toString 替换 getMessage,但 没有用。显然我在这里做错了一些小事。

这是我使用的代码:

jthrowable java_exception;
jclass java_class;
jmethodID method;

java_exception = (*jEnv)->ExceptionOccurred(jEnv);
assert (java_exception != NULL);
java_class = (*jEnv)->GetObjectClass (jEnv, java_exception);
assert (java_class != NULL);
method = (*jEnv)->GetMethodID (jEnv, java_class, "getMessage", "()Ljava/lang/String;");
if (method == NULL) {
printf ("Seriously, how do I get here?!\n");
(*jEnv)->ExceptionDescribe (jEnv);
return;
}

此代码的输出(除其他外)如下所示:

Seriously, how do I get here?!
Exception in thread "main" java.lang.NoClassDefFoundError: com/planet/core360/docgen/Processor

javap -p -s java.lang.Throwable 给我这个:

Compiled from "Throwable.java"
public class java.lang.Throwable extends java.lang.Object implements java.io.Serializable{
...
public java.lang.String getMessage();
Signature: ()Ljava/lang/String;
...

最佳答案

好吧,看起来我的问题是 GetObjectClass 在 jthrowable 上没有按照您期望的方式运行,或者至少它的结果对目的没有用获取方法。用这个替换那部分代码:

java_class = (*jEnv)->FindClass (jEnv, "java/lang/Throwable");
method = (*jEnv)->GetMethodID (jEnv, java_class, "getMessage", "()Ljava/lang/String;");

太奇怪了,那个。不过,我希望这对以后的其他人有所帮助。

关于java - 为什么我的 JNI 代码没有成功找到 jthrowable 的 getMessage 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/215638/

相关文章:

android - 如何获取 .so 文件的依赖项列表?

java - 将native方法定义为public native synchronized int doSum(int a, int b)对吗?

java - Tomcat 中 OpenCV 的 UnsatisfiedLinkError

java - 在 Windows 和 Linux 上从 Java 调用 R

java - 如何从linkedList中递归删除一个项目?

c# - 在抛出并捕获异常后恢复执行代码

c++ - 零成本异常处理 vs setjmp/longjmp

java - 在 AutoCloseable close() 中检测异常

java - 如何在 Xamarin Android 中等待处理程序线程完成?

java - 为 apache httpcomponents 使用的线程命名