1. 程式人生 > >C++ 程式碼建立虛擬機器呼叫java方法

C++ 程式碼建立虛擬機器呼叫java方法

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

呼叫自定義類中的方法的例子見 linux: cpp create JVM to invoke Java method