多语言调用之 Java调用C/C++

Java 调用 C/C++
1.创建一个类com.test.TestCall
内容如下
package com.test;

public class TestCall {

 public native String getResponse(String request);
}

2.编译得到TestCall.class文件
命令javah com.test.TestCall(如果不好使,前面执行一句set classpath=.)
得到com_test_TestCall.h文件,内容如下
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_test_TestCall */

#ifndef _Included_com_test_TestCall
#define _Included_com_test_TestCall
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_test_TestCall
 * Method:    getResponse
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_test_TestCall_getResponse
  (JNIEnv *, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif

3.新建C/C++工程,引入com_test_TestCall.h头文件
TestCall.cpp
#include "com_test_TestCall.h"
JNIEXPORT jstring JNICALL Java_com_test_TestCall_getResponse
  (JNIEnv *pEnv, jobject obj, jstring jstr)

 jstring response = pEnv->NewStringUTF("call C:");
 jboolean isCpoy;
 const jchar *request = pEnv->GetStringChars(jstr,&isCpoy) ;
 //todo
 pEnv->ReleaseStringChars(jstr,request);
 return response;
}
编译成TestCall.dll

4.将TestCall.dll放到eclipse工程下(或者运行参数java -Djava.library.path=“dll目录”)
完整TestCall.java
package com.test;

public class TestCall {
 
 static
 {
  //dll名字
  System.loadLibrary("TestCall");
 }

 public native String getResponse(String request);
 
 public static void main(String[] args)
 {
  TestCall call = new TestCall();
  String message = call.getResponse("hello");
  javax.swing.JOptionPane.showMessageDialog(null, message);
 }
}

5.运行java,弹出对话框就算成功了。

当然现在有Java Native Access这个开源项目,方便了我们的调用。
JNA里面不需要按照com_test_XX这种格式定义头文件,只要定义一个方法接口,支持指针,非常好用。

 

posted @ 2008-12-22 19:33  好好学习,天天进步  阅读(261)  评论(0编辑  收藏  举报