C++ 程式碼建立虛擬機器呼叫java方法
阿新 • • 發佈:2019-02-04
Java 和 C/C++程式碼的互相呼叫一般都是採用JNI的方法,首先Java 類 J 通過native函式呼叫在 對應的C++檔案C中的方法,C檔案儲存相應的虛擬機器和JNIEnv等變數,獲取java類中的方法或者屬性的ID,進而回調J中的方法。但有時候需要直接從C++的方法中呼叫java的方法,這就需要在C++程式碼中建立虛擬機器,從而直接呼叫java中的程式碼。
程式碼如下:(main.cpp)
#include <jni.h> #include <stdio.h> int main(int argc, char** argv){ JavaVM* vm; JNIEnv* env; JavaVMInitArgs vm_args; vm_args.version = JNI_VERSION_1_4; vm_args.nOptions = 0; vm_args.ignoreUnrecognized = 1; // Construct a VM jint res = JNI_CreateJavaVM(&vm, (void **)&env, &vm_args); // Construct a String jstring jstr = env->NewStringUTF("Hello World"); // First get the class that contains the method you need to call jclass clazz = env->FindClass("java/lang/String"); // Get the method that you want to call jmethodID to_lower = env->GetMethodID(clazz, "toLowerCase", "()Ljava/lang/String;"); // Call the method on the object jobject result = env->CallObjectMethod(jstr, to_lower); // Get a C-style string const char* str = env->GetStringUTFChars((jstring) result, NULL); printf("%s\n", str); // Clean up env->ReleaseStringUTFChars(jstr, str); // Shutdown the VM. vm->DestroyJavaVM(); }
編譯如下:
$ export LD_LIBRARY_PATH=/....../jdk1.6.0_26/jre/lib/i386/server/ #路徑指向包含 libjvm.so 檔案的目錄
$ g++ -I/....../jdk1.6.0_26/include/ -I/....../jdk1.6.0_26/include/linux/ -L/....../jdk1.6.0_26/jre/lib/i386/server/ -ljvm main.cpp
$./a.out
即可看到程式的輸出的結果
執行環境:uBuntu 10.04