用JINI来实现Java与C/C++的相互调用.感觉好麻烦,但形势就这样,没办法。
环境:Win7+VS2012+Java 1.7
1. 编写一个Java文件,对于需要C/C++实现的方法,声明为native(本地方法)
里面有个System.loadLibrary即从java.library.path中指定的目录下面加载指定的动态链接库,无须指定目录和扩展名,直接在参数中输入库名称即可。
也可以用System.load直接指定路径的方式来加载。效果是一样的。
package com.xcl.jini;
public class XclJini {
//声明为本地方法,生成为C/C++使用的.h 头文件中的函数声明。
public native int GetVersion();
public native int GetStatus();
public native String GetMsg();
public native int SendMsg(String msg);
static {
//jvm变量
//System.out.println(System.getProperty("java.library.path"));
//C:\java\jdk\bin
System.loadLibrary("XclJiniLib");
//System.load("C:\\java\\jdk\\bin\\XclJiniLib.dll");
}
/**
* @param args
*/
public static void main(String[] args){
System.out.println("__________________________");
System.out.println("Java: jini 演示!");
XclJini _XclJini = new XclJini();
_XclJini.GetVersion();
_XclJini.GetStatus();
_XclJini.SendMsg("发个信息给C++.");
String msg = _XclJini.GetMsg();
System.out.println("java:"+msg);
System.out.println("__________________________");
}
}
2. 首先通过javac编译成class,再通过javah生成供C/C++使用的.h头文件。
因为XclJini.java中包含中文件,且是用utf-8格式存储的,所以编译时javac要加上 -encoding utf-8 参数,否则中文会显示成乱码。
另javah时,要注意,其路径中src下,然后javah后接类路径才能生成正确的头文件
D:\AppWork\XExample\workspace\jni_demo1\src>javac -encoding utf-8 com/xcl/jini/XclJini.java D:\AppWork\XExample\workspace\jni_demo1\src>javah com.xcl.jini.XclJini D:\AppWork\XExample\workspace\jni_demo1\src>dir D:\AppWork\XExample\workspace\jni_demo1\src\com\xcl\jini\*.* 驱动器 D 中的卷是 Data 卷的序列号是 0EC2-012C D:\AppWork\XExample\workspace\jni_demo1\src\com\xcl\jini 的目录 2014/03/24 17:04. 2014/03/24 17:04 .. 2014/03/24 23:15 804 XclJini.class 2014/03/24 23:14 683 XclJini.java 2 个文件 1,487 字节 2 个目录 19,575,050,240 可用字节 D:\AppWork\XExample\workspace\jni_demo1\src>dir 驱动器 D 中的卷是 Data 卷的序列号是 0EC2-012C D:\AppWork\XExample\workspace\jni_demo1\src 的目录 2014/03/24 23:16 . 2014/03/24 23:16 .. 2014/03/23 23:20 com 2014/03/24 23:16 1,046 com_xcl_jini_XclJini.h 1 个文件 1,046 字节 3 个目录 19,575,050,240 可用字节 D:\AppWork\XExample\workspace\jni_demo1\src>
3. C/C++对其头文件的实现.
#include "com_xcl_jini_XclJini.h" #include#include "ConvertJini.h" /* * Class: com_xcl_jini_XclJini * Method: GetVersion * Signature: ()I */ JNIEXPORT jint JNICALL Java_com_xcl_jini_XclJini_GetVersion (JNIEnv *, jobject) { printf("C++: GetVersion() Version 1.1\n"); return 0; } /* * Class: com_xcl_jini_XclJini * Method: GetStatus * Signature: ()I */ JNIEXPORT jint JNICALL Java_com_xcl_jini_XclJini_GetStatus (JNIEnv *, jobject) { printf("C++: GetStatus()\n"); printf("C++: Running.....\n"); printf("C++: GetStatus() end.\n"); return 1; } /* * Class: com_xcl_jini_XclJini * Method: GetMsg * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_xcl_jini_XclJini_GetMsg (JNIEnv * env, jobject jobj) { printf("C++: GetMsg()\n"); char *ret = "C++ Message."; ConvertJini cj ; jstring jret = cj.stoJstring(env,ret); printf("C++: GetMsg() end.\n"); return jret; } /* * Class: com_xcl_jini_XclJini * Method: SendMsg * Signature: (Ljava/lang/String;)I */ JNIEXPORT jint JNICALL Java_com_xcl_jini_XclJini_Se