導航:首頁 > 編程語言 > c調用java代碼

c調用java代碼

發布時間:2025-08-01 01:53:01

㈠ 請教JNI編程中C調用java實現中NullPointerException問題

java 與 C++ 兩種編程語言,它們之間的相互調用:
1、java 調用C++編寫的dll,可使用JNI 或 Jawin 開源項目(推薦第二種方法)。
2、C++ 調用java 的變數、方法,通過JNI (Java Native Interface)與java類交互。

----操作步驟(只總結第二個)-----
(1) vc6.0編譯C++程序,開發環境設置:工具--》選項--》工具,工具標簽下:選擇「include files」,加入頭文件目錄:C:\Program Files\Java\jdk1.5.0\include 和 C:\Program Files\Java\jdk1.5.0\include\win32 ;選擇「Libary files"下,加入LIB目錄:C:\Program Files\Java\jdk1.5.0\lib 。會編譯成exe文件。
執行程序環境設置: Path環境變數加入:C:\Program Files\Java\jdk1.5.0\jre\bin\client (jvm.dll所在目錄),若不加入path會提示,執行時找不到jvm.dll.

(2)GetStaticMethodID(cls,"main","([Ljava/lang/String;)V");
//([Ljava/lang/String;)V 是main()簽名
在java程序目錄下執行:javap -s -p ClassDemo (注:ClassDemo.java 已經編譯)
取main 下面的語句 :: Signature: ([Ljava/lang/String;)V

(3)附代碼示例:

java程序
import java.io.*;
public class DemoMain{
public static void main(String[] args) throws java.io.IOException, java.lang.NullPointerException
{
System.out.println("This is a test.");
}
}

C++程序:
#ifndef __cplusplus
#define __cplusplus
#endif
#include "jni.h"
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#pragma comment (lib,"C:\\Program Files\\Java\\jdk1.5.0\\lib\\jvm.lib") // 動態調用lib
#pragma warning(disable: 4129) // 關閉 warning, 4129
void main() {
LoadLibrary("C:\\Program Files\\Java\jre1.5.0\\bin\\client\\jvm.dll"); // 動態調用dll
JavaVM *jvm;
JNIEnv *env;
JavaVMInitArgs vm_args;
JavaVMOption options[3];
options[0].optionString = "-Djava.compiler=NONE";
options[1].optionString = "-Djava.classpath=.";
options[2].optionString = "-verbose:jni";
vm_args.version = JNI_VERSION_1_4;
vm_args.nOptions = 3;
vm_args.options = options;
vm_args.ignoreUnrecognized = JNI_TRUE;
jint res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); // 創建虛擬機
if (res < 0) {
fprintf(stderr, "Can't create Java VM\n");
exit(1);
};
jclass cls = env->FindClass("DemoMain");
if (cls == 0) printf("Sorry, I can't find the class");
fprintf(stdout, "This is invokeSimplified4.\n");
jmethodID get_main_id;
if(cls != NULL)
{
get_main_id =env->GetStaticMethodID(cls,"main","([Ljava/lang/String;)V");
fprintf(stdout, "This is invokeSimplified5.\n");
if(get_main_id != NULL )
{
jclass string = env->FindClass("java/lang/String");
jobjectArray args = env->NewObjectArray(0,string, NULL);
fprintf(stdout, "This is invokeSimplified6.\n");
int i = env->CallIntMethod(cls, get_main_id, args);
fprintf(stdout, i+ "This is invokeSimplified7.\n");
}
}
jvm->DestroyJavaVM();
fprintf(stdout, "Java VM destory\n");
}

閱讀全文

與c調用java代碼相關的資料

熱點內容
電子編程創造視頻 瀏覽:430
數控車圖紙及編程 瀏覽:826
amazona9演算法更新 瀏覽:98
排版問題遺傳演算法 瀏覽:802
華為怎麼突破根伺服器 瀏覽:546
為什麼手賬app會出現故障 瀏覽:693
虛擬機網頁進入百度的命令 瀏覽:97
ds18b20linux 瀏覽:182
ai和方舟編譯器 瀏覽:414
用正方形紙做的解壓小玩具 瀏覽:923
發電機組維修壓縮機維修 瀏覽:595
吃雞查看戰績用什麼app 瀏覽:576
年薪百萬的程序員開發不出來 瀏覽:658
phpapp支付介面開發 瀏覽:558
跑步穿壓縮褲好嗎 瀏覽:596
set去重java 瀏覽:656
雞蛋溯源碼怎麼掃 瀏覽:592
數字演算法規律查詢 瀏覽:694
程序員現在學前端還是後端好 瀏覽:374
ansysesel命令 瀏覽:554