在C++中調用Java代碼,通常需要使用Java Native Interface (JNI)
首先,創建一個Java類并導出一個靜態方法。例如,創建一個名為MyClass.java
的文件:
public class MyClass {
public static int add(int a, int b) {
return a + b;
}
}
編譯這個Java文件,并使用javac
命令生成一個名為MyClass.class
的字節碼文件。
javac
編譯Java類:javac MyClass.java
javah
生成JNI頭文件:javah -jni MyClass
這將生成一個名為MyClass.h
的頭文件,其中包含JNI函數簽名。
在C++中實現JNI函數,例如add
方法。創建一個名為myclass.cpp
的文件:
#include <jni.h>
#include "MyClass.h"
JNIEXPORT jint JNICALL Java_MyClass_add(JNIEnv *env, jclass cls, jint a, jint b) {
return a + b;
}
確保在編譯C++代碼時鏈接到Java運行時庫(-ljvm
)。例如,使用g++
編譯器:
g++ -shared -fPIC -I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux myclass.cpp -o libmyclass.so
這將生成一個名為libmyclass.so
的共享庫文件(在Linux上)或動態鏈接庫文件(在其他平臺上)。
在C++代碼中加載Java類并調用靜態方法。創建一個名為main.cpp
的文件:
#include <jni.h>
#include <iostream>
#include "MyClass.h"
int main() {
JavaVMOption options;
JNIEnv *env;
JavaVM *jvm;
JavaVMInitArgs vm_args;
options.optionString = "-Djava.class.path=.";
vm_args.version = JNI_VERSION_1_8;
vm_args.nOptions = 1;
vm_args.options = &options;
vm_args.ignoreUnrecognized = 0;
JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
jclass cls = env->FindClass("MyClass");
jmethodID mid = env->GetStaticMethodID(cls, "add", "(II)I");
jint result = env->CallStaticIntMethod(cls, mid, 3, 4);
std::cout << "Result: " << result << std::endl;
env->DestroyLocalRef(cls);
jvm->Destroy();
return 0;
}
確保在編譯main.cpp
時鏈接到Java運行時庫(-ljvm
)。例如,使用g++
編譯器:
g++ main.cpp -o main -L. -lmyclass -ljvm
這將生成一個名為main
的可執行文件。運行這個可執行文件:
./main
輸出應該是:
Result: 7
這就是如何在C++中調用Java代碼并處理Java的類加載器。