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");
}