在C++中调用Java代码,通常需要使用Java Native Interface (JNI)
- 创建Java类并导出静态方法:
首先,创建一个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函数签名。
- 实现JNI函数:
在C++中实现JNI函数,例如add
方法。创建一个名为myclass.cpp
的文件:
#include#include "MyClass.h" JNIEXPORT jint JNICALL Java_MyClass_add(JNIEnv *env, jclass cls, jint a, jint b) { return a + b; }
- 编译C++代码:
确保在编译C++代码时链接到Java运行时库(-ljvm
)。例如,使用g++
编译器:
g++ -shared -fPIC -I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux myclass.cpp -o libmyclass.so
这将生成一个名为libmyclass.so
的共享库文件(在Linux上)或动态链接库文件(在其他平台上)。
- 加载Java类并调用静态方法:
在C++代码中加载Java类并调用静态方法。创建一个名为main.cpp
的文件:
#include#include #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; }
- 编译并运行C++代码:
确保在编译main.cpp
时链接到Java运行时库(-ljvm
)。例如,使用g++
编译器:
g++ main.cpp -o main -L. -lmyclass -ljvm
这将生成一个名为main
的可执行文件。运行这个可执行文件:
./main
输出应该是:
Result: 7
这就是如何在C++中调用Java代码并处理Java的类加载器。