1. 程式人生 > 其它 >Linux環境中使用JNI實現C語言 呼叫 java語言

Linux環境中使用JNI實現C語言 呼叫 java語言

技術標籤:Cjavalinuxjdkjvm

1)本程式碼的3個原始檔都在同一級目錄下面進行的測試驗證

java:hello.java

public class hello
{
    public void hello() {
        System.out.println("hello() constructor run …");
    }
    public void print() {
        System.out.println("hello.print() run");
    }
    public static void StaticFunction() {
        System.out.println("— static void StaticFunction() run");
    }
    public static int add(int a,int b) {
        int c=a+b;
        System.out.println("— static int add(int,int) run —");
        System.out.println( a + "+"+ b + "=" + c );
        return a + b;
    }
    public static int showString(String str) {
        System.out.println("— static int showString(String) run —");
        System.out.println("static showString() receive –>"+ str + " <–");
        return 0;
    }
}

C語言:c_call_java_hello.c

#include <jni.h>
#include <stdlib.h>
#include <stdio.h>

int main(int argc,char argv[]) {
    JavaVMOption options[1];
    JNIEnv *env; //c語言編寫一個java虛擬機器跑hello.class檔案
    JavaVM *jvm; //找classID和呼叫class方法來自這裡
    JavaVMInitArgs vm_args;
    long status;
    jclass cls;
    jmethodID mid;
    jint square;
    jobjectArray applicationArgs;
    options[0].optionString = "-Djava.class.path=."; //path=.表明類路徑(如hello.class)在當前路徑,可以接收路徑引數
    vm_args.version = 0x00010002; //也可以寫成JNI_VERSION_1_2;的巨集,指明所用的虛擬機器版本
    vm_args.nOptions = 1;
    vm_args.options = options;

    status = JNI_CreateJavaVM((JavaVM**)&jvm, (void**)&env, &vm_args);
    if (status != JNI_ERR) {
        printf("create JVM successfully\n");//建立java虛擬機器成功
        cls = (*env)->FindClass(env, "hello"); //在當前路徑.中尋找hello.class
        if(cls !=0) {
            printf("find class successfully\n");//成功找到hello.class
            mid = (*env)->GetStaticMethodID(env, cls, "StaticFunction", "()V"); //找名為StaticFunction,接收引數為()返回型別為V(oid)的靜態函式ID,這些方法可用javap -s hello來查看出所有可呼叫方法以及引數列表
            if(mid !=0) {
                printf("get static method successfullyn\n");//找到
                (*env)->CallStaticVoidMethod(env, cls, mid, applicationArgs);//呼叫,applicationArgs是該函式如果需要引數,用來傳引數
            }
        }
        (*jvm)->DestroyJavaVM(jvm); //摧毀虛擬機器
        return 0;
    } else {
        return -1;
    }
}

shell編譯指令碼:build.sh

#sudo apt install default-jdk  安裝java jdk
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/jvm/java-1.11.0-openjdk-amd64/lib/server
gcc -o jvm c_call_java_hello.c                                  \
    -I /usr/lib/jvm/java-1.11.0-openjdk-amd64/include/          \
    -I /usr/lib/jvm/java-1.11.0-openjdk-amd64/include/linux/    \
    -L /usr/lib/jvm/java-1.11.0-openjdk-amd64/lib/server        \
    -ljvm
./jvm

執行結果: