C語言呼叫 Java(Linux)
一、書寫C檔案,模擬JDK中自帶的java命令
- #include <jni.h>
- #include <stdlib.h>
- #include <stdio.h>
- int main(int argc, char*argv[])
- {
- JavaVM *jvm;
- JNIEnv *env;
- JavaVMInitArgs vm_args;
- JavaVMOption options[1];
- jobjectArray applicationArgs;
- jstring appArg;
- /*
- * Setting VM arguments
- */
- vm_args.version = JNI_VERSION_1_2;
- vm_args.ignoreUnrecognized = JNI_TRUE;
- vm_args.nOptions = 0;
- /*
- * Setting classpath
- */
- char classpath[1024] = "-Djava.class.path=";
- char *env_classpath = getenv("CLASSPATH");
- int mainclass_index = 1;
- if (argc >= 3 && !strcmp("-classpath", argv[1])) {
- options[0].optionString = strcat(classpath, argv[2]);
- vm_args.nOptions++;
- mainclass_index += 2;
- } else if (env_classpath) {
- options[0].optionString = strcat(classpath, env_classpath);
- vm_args.nOptions++;
- }
- if (vm_args.nOptions > 0) {
- vm_args.options = options;
- }
- if (mainclass_index >= argc) {
- printf("Main class not found, please specify it\n");
- return 0;
- }
- jint res = JNI_CreateJavaVM(&jvm, (void **)&env, &vm_args);
- if (res < 0) {
- printf("Create Java VM error, code = %d\n", res);
- return -1;
- }
- jclass cls = (*env)->FindClass(env, argv[mainclass_index]);
- if (!cls) {
- printf("Class %s not found\n", argv[mainclass_index]);
- return -1;
- }
- jmethodID mid = (*env)->GetStaticMethodID(env, cls, "main", "([Ljava/lang/String;)V");
- if (!mid) {
- printf("Method %s of Class %s not found\n", "main", argv[mainclass_index]);
- return -1;
- }
- applicationArgs = (*env)->NewObjectArray(env, argc - mainclass_index - 1,
- (*env)->FindClass(env, "java/lang/String"),
- NULL);
- int i = 0;
- for (i = mainclass_index + 1; i < argc; i ++) {
- appArg = (*env)->NewStringUTF(env, argv[i]);
- (*env)->SetObjectArrayElement(env, applicationArgs, i - mainclass_index - 1, appArg);
- }
- (*env)->CallStaticVoidMethod(env, cls, mid, applicationArgs);
-
- printf("before destroy\n");
- /*
- * Destroy the JVM.
- * This is necessary, otherwise if the called method exits,
- * this program will return immediately.
- */
- (*jvm)->DestroyJavaVM(jvm);
- printf("after destroy\n");
- return 0;
- }
二、編譯,書寫makefile檔案 ,注意要連結JDK中所自帶的jvm.so檔案,“-L/usr/lib64/jvm/java-1_6_0-ibm-1.6.0/jre/bin/classic”
- all:CCallJava
- CCallJava:
- gcc -o CCallJava CCallJava.c -I/usr/lib64/jvm/java-1_6_0-ibm-1.6.0/include/ -I/usr/lib64/jvm/java-1_6_0-ibm-1.6.0/include/linux/ -L/usr/lib64/jvm/java-1_6_0-ibm-1.6.0/jre/bin/classic -ljvm -ldl
三、修改.bash_profile檔案,設定環境變數,即libjvm.so 所在的路徑
export LD_LIBRARY_PATH=/usr/lib64/jvm/java-1_6_0-ibm-1.6.0/jre/bin/classic
四、執行命令./CCallJava -classpath . Test 34 67
結果如下
至此,C語言呼叫Java程式完成
參考資料:
http://supermmx.org/blog/20060811_calling_java_from_c_cplusplus
相關文章
- JAVA JNI 呼叫C語言 DemoJavaC語言
- C語言 JNI 呼叫JAVA DemoC語言Java
- java開發C語言編譯器:為C語言提供API呼叫JavaC語言編譯API
- Java如何呼叫C語言程式,JNI技術JavaC語言
- Linux下跨語言呼叫C++實踐LinuxC++
- go語言與c語言的相互呼叫GoC語言
- C語言函式呼叫棧C語言函式
- JNI開發系列③C語言呼叫Java欄位與方法C語言Java
- C語言動態呼叫庫(轉)C語言
- Linux-C語言LinuxC語言
- C語言關於多原始檔的呼叫C語言
- JAVA呼叫C語言下的DLL檔案JavaC語言
- c語言是如何處理函式呼叫的?C語言函式
- 在Windows Phone專案中呼叫C語言DLLWindowsC語言
- Java語言與C++語言的差異總結JavaC++
- Java與C語言的區別?JavaC語言
- C語言 C語言野指標C語言指標
- C語言---“C語言 誰與爭鋒?”C語言
- 從彙編角度分析C語言的過程呼叫C語言
- 深入理解 C 語言的函式呼叫過程函式
- 深入理解C語言的函式呼叫過程C語言函式
- Java語言和C++語言的差異 (轉)JavaC++
- Linux核心C語言將升級LinuxC語言
- c語言實現linux抓包C語言Linux
- Linux中的C語言妙用(轉)LinuxC語言
- C語言C語言
- 組合語言-019(彙編程式與c\c++相互呼叫)組合語言C++
- c如何呼叫javaJava
- 初學計算機語言者(C語言,C++,java,pytion,C#)計算機C語言C++JavaC#
- 聊聊C語言/C++—程式和程式語言C語言C++
- 【開發語言】PHP、Java、C語言的編譯執行過程PHPJavaC語言編譯
- Linux下C語言驗證多程式LinuxC語言
- linux下使用mysql的C語言APILinuxMySqlC語言API
- Linux下C語言程式設計(轉)LinuxC語言程式設計
- C語言呼叫System命令並獲取命令的返回值C語言
- Java之父評價C語言之父:C語言撐起了一切JavaC語言
- VS2017如何使用C_C++語言呼叫匯編函式C++函式
- Linux C/C++呼叫mongDBLinuxC++