JINI(1) Java与C/C++的交互(一)

2014-11-24 11:18:52 · 作者: · 浏览: 0

用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