在C++中調用Java時,可以使用JNI(Java Native Interface)來實現。當在C++代碼中拋出Java異常時,需要捕獲該異常并將其傳遞回Java環境。以下是一個簡單的示例,展示了如何在C++中調用Java方法并處理異常傳遞。
首先,創建一個Java類MyClass.java
:
public class MyClass {
public void myMethod() throws Exception {
System.out.println("Inside Java method");
throw new Exception("An error occurred in Java method");
}
}
接下來,使用javac
編譯該類,并使用javah
生成JNI頭文件:
javac MyClass.java
javah -jni MyClass
然后,創建一個C++文件my_class.cpp
,實現JNI函數:
#include <jni.h>
#include <iostream>
#include "MyClass.h"
JNIEXPORT void JNICALL Java_MyClass_myMethod(JNIEnv *env, jobject obj) {
try {
jclass cls = env->GetObjectClass(obj);
jmethodID mid = env->GetMethodID(cls, "myMethod", "()V");
env->CallVoidMethod(obj, mid);
} catch (const std::exception &e) {
std::cerr << "Caught exception: " << e.what() << std::endl;
env->ThrowNew(env->FindClass("java/lang/Exception"), e.what());
} catch (...) {
std::cerr << "Caught unknown exception" << std::endl;
env->ThrowNew(env->FindClass("java/lang/Exception"), "Unknown exception occurred");
}
}
最后,使用g++
編譯C++代碼,并創建一個共享庫:
g++ -shared -fPIC -I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux my_class.cpp -o libmy_class.so
現在,可以在Java代碼中使用System.loadLibrary()
加載共享庫,并調用myMethod()
方法:
public class Main {
public static void main(String[] args) {
System.loadLibrary("my_class");
MyClass myObject = new MyClass();
try {
myObject.myMethod();
} catch (Exception e) {
System.err.println("Caught exception from C++: " + e.getMessage());
}
}
}
運行Java程序,將看到以下輸出:
Inside Java method
Caught exception from C++: An error occurred in Java method
這樣,當Java方法拋出異常時,C++代碼會捕獲該異常并將其傳遞回Java環境。