Linux環境中使用JNI實現C語言 呼叫 java語言
阿新 • • 發佈:2020-12-14
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
執行結果: