簡體   English   中英

如何從Java本機接口(jni)調用getStackTrace方法

[英]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/NoSuchMethodErrorgetStackTrace異常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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM