开发者社区> maojunxu> 正文

Java调用C/C++实现的DLL动态库——JNI

简介: 由于项目的需要,最近研究了java 调用DLL的方法,将如何调用的写于此,便于日后查阅: 采用的方法是JNI:Java Native Interface,简称JNI,是Java平台的一部分,可用于让Java和其他语言编写的代码进行交互。
+关注继续查看

由于项目的需要,最近研究了java 调用DLL的方法,将如何调用的写于此,便于日后查阅:

采用的方法是JNI:Java Native Interface,简称JNI,是Java平台的一部分,可用于让Java和其他语言编写的代码进行交互。

下面是从网上摘取的JNI工作示意图:

 

总体说明:先在JAVA中建立一个类,通过javac生成.class,再由javah生成.h;然后将.h复制到VC下,由VC实现具体函,

并编译通过后生成DLL,将DLL放入JAVA工程中使用,完毕。

下面说说具体步骤(含实例):

1、建java类:装载DLL,声明要使用DLL方法,具体实现由DLL负责;代码如下:

public class Java2cpp
{
  static 
  { 
    System.loadLibrary("javaCallcpp"); 
  } 

  public native int DLL_ADD(int a,int b);    //加
  public native int DLL_SUB(int a,int b);    //减
  public native int DLL_MUL(int a,int b);    //乘
  public native int DLL_DIV(int a,int b);     //除

  public static void main(String args[])
  {

    int sum = 0;

    Java2cpp test = new Java2cpp();

    sum = test.DLL_ADD(2, 4);
    System.out.println("Java call cpp dll result:" + sum);
  }

}

2、生成.h文件:cmd 到Java2cpp.java目录下,做如下操作:

  第一步:javac Java2cpp.java  生成java2cpp.class

  第二步:javah Java2cpp  生成Java2cpp.h头文件,内容如下:

注意:Java2cpp.h这个头文件的内容是不能修改的,否则会出错。

3、制做VC动态库:创建一个C/C++动态库工程,命名为javaCallcpp,导入java2cpp.h并实现其方法:

#include "Java2cpp.h"
#include "dllApi.h"

JNIEXPORT jint JNICALL Java_Java2cpp_DLL_1ADD(JNIEnv *env, jobject obj, jint a, jint b)
{
  int var = 0;

  var = DLL_API_ADD(a,b);

  return var;
}

JNIEXPORT jint JNICALL Java_Java2cpp_DLL_1SUB(JNIEnv *env, jobject obj, jint a, jint b)
{
  int var = 0;

  var = DLL_API_SUB(a,b);

  return var;
}

JNIEXPORT jint JNICALL Java_Java2cpp_DLL_1MUL(JNIEnv *env, jobject obj, jint a, jint b)
{
  int var = 0;

  var = DLL_API_MUL(a,b);

  return var;
}

JNIEXPORT jint JNICALL Java_Java2cpp_DLL_1DIV(JNIEnv *env, jobject obj, jint a, jint b)
{
  int var = 0;

  var = DLL_API_DIV(a,b);

  return var;
}  //此文件完

加DLL_API_ADD()、减DLL_API_SUB()、乘DLL_API_MUL()、除DLL_API_DIV()四个函数在别一个

文件中实现,文件名是dllApi.cpp,实现如下:

int DLL_API_ADD(int a,int b)
{
  return (a+b);
}

int DLL_API_SUB(int a,int b)
{
  return (a-b);
}

int DLL_API_MUL(int a,int b)
{
  return (a*b);
}

int DLL_API_DIV(int a,int b)
{
  return (a/b);
}  //此文件完

此时工程还编译不过,因为include<jni.h>出错,需添加JNI所在的目录,如下:

 

4、编译动态库工程:生成javaCallcpp.dll,并将这个动态库复制到java工程目录下:

5、使用DLL:运行java程序,结果如下:

至此,java调用dll已经完成。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
动态调用WCF服务
本文转载:http://www.cnblogs.com/wiseant/archive/2010/07/29/1787599.html 原文地址:http://blog.csdn.net/castlooo/archive/2010/05/06/5562619.aspx   客户端调用wcf ,有时需要动态的调用服务端的WCF中的方法,本方法,反射wcf 的接口,动态调用接口中的方法。
808 0
Spring调用存储过程
public Boolean bindCard(final BindCardProfile bindCardProfile) throws DataAccessException { if (bindCardProfile == null) { return false; } String dbRetu
1170 0
C/C++封装库ocicpplib调用Oracle存储过程的方法
工作这么多年,一直使用Mysql, Oracle数据库没有接触过, 这次要使用C/C++语言来调用Oracle的存储过程, 懒得自己去看OCI的API了, 直接上网找别人封装的库, 最后发现了这个ocicpplib, 下载了看了一下, 还不错, 使用起来比较简单。
1135 0
【Android 逆向】Android 进程注入工具开发 ( 远程进程注入动态库文件操作 | 注入动态库 加载 业务动态库 | 业务动态库启动 | pthread_create 线程开发 )
【Android 逆向】Android 进程注入工具开发 ( 远程进程注入动态库文件操作 | 注入动态库 加载 业务动态库 | 业务动态库启动 | pthread_create 线程开发 )
12 0
C# 调用存储过程操作 OUTPUT参数和Return返回值
本文转载:http://www.cnblogs.com/libingql/archive/2010/05/02/1726104.html   存储过程是存放在数据库服务器上的预先编译好的sql语句。使用存储过程,可以直接在数据库中存储并运行功能强大的任务。
889 0
JAVA调用CMD命令
JAVA调用CMD命令
31 0
【Android NDK 开发】Ubuntu 函数库交叉编译 ( Android 动态库交叉编译 | Android 静态库交叉编译 )
【Android NDK 开发】Ubuntu 函数库交叉编译 ( Android 动态库交叉编译 | Android 静态库交叉编译 )
19 0
+关注
702
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载