多语言调用:Java调用C/C++
来源:优易学  2011-12-26 16:27:03   【优易学:中国教育考试门户网】   资料下载   IT书店
 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这种格式定义头文件,只要定义一个方法接口,支持指针,非常好用。

责任编辑:小草

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训