當前位置:編程學習大全網 - 編程語言 - 請教JNI編程中C調用Java實現中NullPointerException問題

請教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");

}

  • 上一篇:美圖軟件哪個最好用
  • 下一篇:Ios6.1.3越獄(解鎖更多功能和應用)
  • copyright 2024編程學習大全網