C 程序中運行 Java 類

Java代碼

InvocationApiTest.java

public class InvocationApiTest{

    public static void main(String[) args){
        System.out.println(args[O]);
    } 
}

編譯 InvocationApiTest.java 生成 InvocationApiTest.class

C代碼

invocationApi.c

#include <jni.h>

int main(){
    JNIEnv *env;
    JavaVM *vm;
    JavaVMInitArgs vm_args;
    JavaVMOption options[1];
    jint res;
    jclass cls;
    jmethodID mid;
    jstring jstr;
    jclass stringClass;
    jobjectArray args;

    //1.生成 Java 虛擬機選項
    options[0].optionString = "-Djava.class.path=.";
    vm_args.version = 0x00010002;
    vm_args.options = options;
    vm_args.nOptions = 1;
    vm_args.ignoreUnrecognized = JNI_TRUE;

    //2.生成 Java 虛擬機
    res = JNI_CreateJavaVM(&vm, (void**)&env, &vm_args);

    //3.查找並加載類
    cls = (*env)->FindClass(env, "InvocationApiTest");

    //4.獲取 main() 方法的 ID
    mid = (*env)->GetStaticMethodID(env, cls, "main", "([Ljava/lang/String;)V");

    //5.生成字符串對象,用作 main() 方法的參數
    jstr = (*env)->NewStringUTF(env, "Hello Invocation API!!");
    stringClass = (*env)->FindClass(env, "java/lang/String");
    args = (*env)->NewObjectArray(env, 1, stringClass, jstr);

    //6.調用 main() 方法
    (*env)->CallStaticVoidMethod(env, cls, mid, args); 

    //7.銷燬 Java 虛擬機
    (*vm)->DestroyJavaVM(vm);
}

編譯C代碼(Ubuntu)

gcc -I /usr/lib/jvm/java-7-openjdk-amd64/include -I /usr/lib/jvm/java-7-openjdk-amd64/include/linux -L /usr/lib/jvm/java-7-openjdk-amd64/jre/lib/amd64/server/ invocationApi.c -ljvm

注:-I 參數添加 jni.h 和 jni_md.h 頭文件路徑,-L 參數添加 libjvm.so 共享庫路徑,-ljvm 參數指定要鏈接的jvm庫。

編譯後生成 a.out 可執行文件

運行

運行之前需要將 libjvm.so 的路徑添加到 /etc/ld.so.conf 文件下
在這裏插入圖片描述

vim /etc/ld.so.conf
# 使修改生效
/sbin/ldconfig 

運行 a.out

./a.out

輸出:
在這裏插入圖片描述
成功!

參考資料:
《Android框架揭祕》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章