[英]How to call getStackTrace method from java native interface (jni)
我試圖通過一些例子來理解jni。 我正在嘗試使用jni獲取Java堆棧跟蹤,所以這就是我正在做的
HelloJNI.java
package test.com.jni;
public class HelloJNI {
static {
System.loadLibrary("hello"); // Load native library at runtime
}
private native StackTraceElement[] getStackTraceNative(Throwable throwable);
private native void printStackTraceNative(Throwable throwable);
public static void main(String[] args) {
test();
}
public static void test() {
new HelloJNI().printStackTraceNative(new Throwable()); //Invoke native method
new HelloJNI().getStackTraceNative(new Throwable());
}
}
本機代碼(為簡化起見,對錯誤進行處理)
test_com_jni_HelloJNI.c
JNIEXPORT jobjectArray JNICALL Java_test_com_jni_HelloJNI_getStackTraceNative (JNIEnv * env, jobject object, jthrowable exception) {
jclass exceptionClazz = (*env)->GetObjectClass(env, exception);
jmethodID getStackTraceMethod = (*env)->GetMethodID(env, exceptionClazz, "getStackTrace", "()[Ljava.lang.StackTraceElement");
jobjectArray stacktraces = (*env)->CallObjectMethod(env, exception, getStackTraceMethod);
return stacktraces;
}
JNIEXPORT void JNICALL Java_test_com_jni_HelloJNI_printStackTraceNative (JNIEnv * env, jobject object, jthrowable exception) {
jclass exceptionClazz = (*env)->GetObjectClass(env, exception); // can't fail
jmethodID printStackTraceMethod = (*env)->GetMethodID(env, exceptionClazz, "printStackTrace", "()V");
(*env)->CallVoidMethod(env, exception, printStackTraceMethod);
}
現在,在此代碼中,本機printStackTraceNative
方法可以工作,並且可以打印堆棧跟蹤,但是, getStackTraceNative
不能。 當我檢查核心轉儲文件時,它說Java java/lang/NoSuchMethodError
了getStackTrace
異常java/lang/NoSuchMethodError
。 我很困惑,因為我傳遞給getStackTraceNative方法的參數屬於throwable類型,throwable應該具有getStackTrace
方法。
我在這里可能缺少什么概念,對此有任何幫助。 謝謝
方法簽名錯誤。 在方法簽名中,合格類名稱中的句號由正斜杠替換。 因此, getStackTrace
的簽名為()[Ljava/lang/StackTraceElement;
(還要注意分號)
您可以使用帶有-s
選項的javap
從類文件中獲取方法簽名:
javap -classpath '/path/to/jre/lib/rt.jar' -s java.lang.Throwable
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.