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已经完成。

目录
相关文章
|
XML JSON JavaScript
json转java实体,JSON和XML的区别比较,c#和c++的编译工具, 静态库和动态库的区别
json转java实体,JSON和XML的区别比较,c#和c++的编译工具, 静态库和动态库的区别
230 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++的动态库,所以重温一下操作步骤记录一下。
3032 0
Java中使用JNI调用本地动态库的方法
在Java中,要使用动态库,就要使用到 JNI。首先来看看百度百科对JNI的描述:从Java1.1开始,Java Native Interface(JNI)标准成为Java平台的一部分,它允许Java代码和其他语言写的代码进行交互。
1324 0
|
Android开发
【错误记录】NDK 导入外部 so 动态库报错 ( java.lang.UnsatisfiedLinkError | Android Studio 配置外部 so 动态库两种方法 )
【错误记录】NDK 导入外部 so 动态库报错 ( java.lang.UnsatisfiedLinkError | Android Studio 配置外部 so 动态库两种方法 )
97 0
【错误记录】NDK 导入外部 so 动态库报错 ( java.lang.UnsatisfiedLinkError | Android Studio 配置外部 so 动态库两种方法 )
|
12天前
|
安全 算法 Java
深入理解Java并发编程:线程安全与性能优化
【4月更文挑战第11天】 在Java中,高效的并发编程是提升应用性能和响应能力的关键。本文将探讨Java并发的核心概念,包括线程安全、锁机制、线程池以及并发集合等,同时提供实用的编程技巧和最佳实践,帮助开发者在保证线程安全的前提下,优化程序性能。我们将通过分析常见的并发问题,如竞态条件、死锁,以及如何利用现代Java并发工具来避免这些问题,从而构建更加健壮和高效的多线程应用程序。
|
4天前
|
安全 Java
深入理解 Java 多线程和并发工具类
【4月更文挑战第19天】本文探讨了Java多线程和并发工具类在实现高性能应用程序中的关键作用。通过继承`Thread`或实现`Runnable`创建线程,利用`Executors`管理线程池,以及使用`Semaphore`、`CountDownLatch`和`CyclicBarrier`进行线程同步。保证线程安全、实现线程协作和性能调优(如设置线程池大小、避免不必要同步)是重要环节。理解并恰当运用这些工具能提升程序效率和可靠性。
|
5天前
|
安全 Java
java多线程(一)(火车售票)
java多线程(一)(火车售票)
|
5天前
|
安全 Java 调度
Java并发编程:深入理解线程与锁
【4月更文挑战第18天】本文探讨了Java中的线程和锁机制,包括线程的创建(通过Thread类、Runnable接口或Callable/Future)及其生命周期。Java提供多种锁机制,如`synchronized`关键字、ReentrantLock和ReadWriteLock,以确保并发访问共享资源的安全。此外,文章还介绍了高级并发工具,如Semaphore(控制并发线程数)、CountDownLatch(线程间等待)和CyclicBarrier(同步多个线程)。掌握这些知识对于编写高效、正确的并发程序至关重要。
|
5天前
|
安全 Java 程序员
Java中的多线程并发编程实践
【4月更文挑战第18天】在现代软件开发中,为了提高程序性能和响应速度,经常需要利用多线程技术来实现并发执行。本文将深入探讨Java语言中的多线程机制,包括线程的创建、启动、同步以及线程池的使用等关键技术点。我们将通过具体代码实例,分析多线程编程的优势与挑战,并提出一系列优化策略来确保多线程环境下的程序稳定性和性能。