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

简介: java JNI

由于项目的需要,最近研究了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已经完成。 

相关文章
|
XML JSON JavaScript
json转java实体,JSON和XML的区别比较,c#和c++的编译工具, 静态库和动态库的区别
json转java实体,JSON和XML的区别比较,c#和c++的编译工具, 静态库和动态库的区别
233 0
json转java实体,JSON和XML的区别比较,c#和c++的编译工具, 静态库和动态库的区别
|
Java Linux C语言
java 通过jni调用linux so动态库
java 通过jni调用linux so动态库准备开发javaC++总结java 通过jni调用linux so动态库欢迎转载 地址:https://blog.csdn.net/qq_15122663/article/details/96732890 最近有个项目需要java调用C++的动态库,所以重温一下操作步骤记录一下。
3040 0
Java中使用JNI调用本地动态库的方法
在Java中,要使用动态库,就要使用到 JNI。首先来看看百度百科对JNI的描述:从Java1.1开始,Java Native Interface(JNI)标准成为Java平台的一部分,它允许Java代码和其他语言写的代码进行交互。
1326 0
|
Java C++
Java调用C/C++实现的DLL动态库——JNI
由于项目的需要,最近研究了java 调用DLL的方法,将如何调用的写于此,便于日后查阅: 采用的方法是JNI:Java Native Interface,简称JNI,是Java平台的一部分,可用于让Java和其他语言编写的代码进行交互。
1250 0
|
Android开发
【错误记录】NDK 导入外部 so 动态库报错 ( java.lang.UnsatisfiedLinkError | Android Studio 配置外部 so 动态库两种方法 )
【错误记录】NDK 导入外部 so 动态库报错 ( java.lang.UnsatisfiedLinkError | Android Studio 配置外部 so 动态库两种方法 )
98 0
【错误记录】NDK 导入外部 so 动态库报错 ( java.lang.UnsatisfiedLinkError | Android Studio 配置外部 so 动态库两种方法 )
|
5天前
|
Java
Java并发编程:深入理解线程池
【4月更文挑战第30天】本文将深入探讨Java并发编程中的一个重要主题——线程池。我们将从线程池的基本概念入手,了解其工作原理和优势,然后详细介绍如何使用Java的Executor框架创建和管理线程池。最后,我们将讨论一些高级主题,如自定义线程工厂和拒绝策略。通过本文的学习,你将能够更好地理解和使用Java的线程池,提高你的并发编程能力。
|
3天前
|
存储 缓存 前端开发
Java串口通信技术探究3:RXTX库线程 优化系统性能的SerialPortEventListener类
Java串口通信技术探究3:RXTX库线程 优化系统性能的SerialPortEventListener类
14 3
|
3天前
|
Java
JAVA难点包括异常处理、多线程、泛型和反射,以及复杂的分布式系统知识
JAVA难点包括异常处理、多线程、泛型和反射,以及复杂的分布式系统知识。入坑JAVA因它的面向对象特性、平台无关性、强大的标准库和活跃的社区支持。
15 2
|
3天前
|
Java 调度 开发者
Java中的多线程编程:基础与实践
【5月更文挑战第2天】本文将深入探讨Java中的多线程编程,从基础概念到实际应用,为读者提供全面的理解和实践指导。我们将首先介绍线程的基本概念和重要性,然后详细解析Java中实现多线程的两种主要方式:继承Thread类和实现Runnable接口。接着,我们将探讨线程同步的问题,包括synchronized关键字和Lock接口的使用。最后,我们将通过一个实际的生产者-消费者模型来演示多线程编程的实践应用。
|
3天前
|
安全 Java 程序员
Java中的多线程编程:从理论到实践
【5月更文挑战第2天】 在计算机科学中,多线程编程是一项重要的技术,它允许多个任务在同一时间段内并发执行。在Java中,多线程编程是通过创建并管理线程来实现的。本文将深入探讨Java中的多线程编程,包括线程的概念、如何创建和管理线程、以及多线程编程的一些常见问题和解决方案。
12 1