在Java中,本地方法(Native Method)是指那些用非Java语言(如C、C++)编写的方法。这些方法可以通过Java Native Interface (JNI) 与Java代码进行交互。JNI允许Java代码调用本地方法,同时也允许本地方法调用Java代码。
javah
工具生成C/C++头文件,然后在C/C++代码中实现这些方法。RegisterNatives
动态注册本地方法。以下是一个简单的示例,展示如何在C++中创建JVM并调用Java方法:
public class HelloWorld {
public native void printHello();
static {
System.loadLibrary("HelloWorldImpl");
}
public static void main(String[] args) {
new HelloWorld().printHello();
}
}
#include <jni.h>
#include <iostream>
extern "C" JNIEXPORT void JNICALL Java_HelloWorld_printHello(JNIEnv *env, jobject obj) {
std::cout << "Hello from C++!" << std::endl;
}
int main(int argc, char **argv) {
JavaVM *jvm;
JNIEnv *env;
JavaVMInitArgs vm_args;
JavaVMOption options[1];
options[0].optionString = "-Djava.class.path=./";
vm_args.version = JNI_VERSION_1_8;
vm_args.nOptions = 1;
vm_args.options = options;
vm_args.ignoreUnrecognized = JNI_FALSE;
// Create the JVM
jint res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
if (res != JNI_OK) {
std::cerr << "Failed to create JVM" << std::endl;
return -1;
}
// Load the Java class
jclass cls = env->FindClass("HelloWorld");
if (cls == nullptr) {
std::cerr << "Failed to find class" << std::endl;
jvm->DestroyJavaVM();
return -1;
}
// Find the main method
jmethodID mid = env->GetStaticMethodID(cls, "main", "([Ljava/lang/String;)V");
if (mid == nullptr) {
std::cerr << "Failed to find main method" << std::endl;
jvm->DestroyJavaVM();
return -1;
}
// Call the main method
env->CallStaticVoidMethod(cls, mid, nullptr);
// Destroy the JVM
jvm->DestroyJavaVM();
return 0;
}
DestroyJavaVM
释放资源。通过以上步骤,你可以在C++中创建JVM并调用Java方法。更多详细信息和示例代码,可以参考Java Native Interface Specification。
领取专属 10元无门槛券
手把手带您无忧上云