什么是JNI?Java Native Interface(Java本地接口)的简写。使用这个接口,可以轻松实现java对动态链接库Dynamic Link Library(dll)文件的调用,以实现一些C/C++的功能
本文章参考自网络一篇文章,做了一些小改动和补充说明。
一、建立java文件
注意点:1.要对dll里面的方法做本地声明
2.加载dll
示例代码:
public class testdll {
static{
System.loadLibrary("goodluck"); //注意:不写扩展名,名字要与dll的文件名一致
}
public native int getValue();
public native void setValue(int i);
/**
* @param args
*/
public static void main(String[] args) {
testdll test=new testdll();
test.setValue(10);
System.out.println(test.getValue());
}
}
二、编译
javac testdll.java ------如果没有错,进行下一步
javah testdll ------生成testdll.h这个头文件
三、实现步骤一中声明的方法
打开VC++6.0,建立一个dll空工程,把testdll.h导入工程中,新建一个test.cpp源文件
打开testdll.h,发现里面有两个方法:
/*
* Class: testdll
* Method: getValue
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_testdll_getValue
(JNIEnv *, jobject);
/*
* Class: testdll
* Method: setValue
* Signature: (I)V
*/
JNIEXPORT void JNICALL Java_testdll_setValue
(JNIEnv *, jobject, jint);
JNIEXPORT不用管,第二个单词jint/void是返回值,jint相当于int类型,JNICALL不用管,每一个方法名前都有前缀Java_testll_,前两个参数JNIEnv *和jobject不用管,第二个方法的第三个参数jint就是java文件里的int i。
上面有声明了,现在就要实现这两个方法,把代码补充进来吧:)
示例代码:
#include "testdll.h"
int i=0;
JNIEXPORT jint JNICALL Java_testdll_getValue
(JNIEnv *, jobject){
return i;
}
JNIEXPORT void JNICALL Java_testdll_setValue
(JNIEnv *, jobject, jint j){
i=j;
}
四、编译
此时编译会出现error,主要是提示找不到jni.h(这个包含在testdll.h)里,需要我们把jni.h、jni_md.h复制到C:\Program Files\Microsoft Visual Studio\VC98\Include这个目录里(默认安装目录,如果安装VC不是这个目录,请自行找到Include目录)。
jni.h------------------jdk安装目录\include
jni_md.h------------jdk安装目录\include\win32
然后再编译,构建,就有了test.dll这个动态链接库文件了,把它重命名成goodluck.dll,然后复制到testdll.java的目录下,运行吧:)
java testdll
结果:
10
分享到:
相关推荐
总结,C++库封装JNI接口实现Java调用C++涉及的主要步骤包括:声明Java中的本地方法,生成JNI头文件,编写C++实现,编译成库,最后在Java中加载并调用。这个过程需要理解Java和C++之间的数据类型转换,以及如何在两种...
我们知道,使用 JNI 调用 .dll/.so 共享类库是非常非常麻烦和痛苦的。 假如有一个现有的 .dll/.so 文件,假如使用 JNI 技术调用,我们首先需要另外使用 C 语言写一个 .dll/.so 共享库,使用 SUN 规定的数据结构替换 ...
最近项目中需要使用JNI,所以研究了一下,其中遇到过不少问题,总结一下,让遇到同样问题的人可以得到解决。 在C/C++中调用Java的方法一般分为五个步骤:初始化虚拟机、获取类、获取类的方法、创建类对象、调用方法...
首先,我们需要声明Java方法的本地方法ID,然后使用JNIEnv接口调用Java方法: ```cpp #include <jni.h> #include extern "C" JNIEXPORT jstring JNICALL Java_com_example_testjni2_MainActivity_stringFromCpp( ...
Java JNI例子-创建DLL、项目导入DLL、IDEA配置JNI、JNI调用DLL(该DLL同时依赖第三方DLL)
Java通过JNI调用C# DLL是一个跨平台、跨语言的技术实践,主要应用于需要利用Java的稳定性和C#的高性能场景。JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。C# ...
这篇博客“JNI学习-C 调用Java”可能详细讲述了如何使用C语言通过JNI来调用Java的方法。 在Java中,JNI提供了一套接口,让本地(Native)代码可以访问Java对象、执行方法、操作数组等。首先,我们需要理解JNI的基本...
Android JNI基础-利用JNI实现JAVA调用C++代码
赠送jar包:zstd-jni-1.4.3-1.jar; 赠送原API文档:zstd-jni-1.4.3-1-javadoc.jar; 赠送源代码:zstd-jni-1.4.3-1-sources.jar; 赠送Maven依赖信息文件:zstd-jni-1.4.3-1.pom; 包含翻译后的API文档:zstd-jni-...
3. **创建 Java 代码**:在 Java 侧,我们需要创建一个 Java 类,该类将使用 JNI 来调用 Golang 函数。首先,定义 native 方法,并使用 `System.loadLibrary()` 加载刚刚生成的库。 ```java public class ...
标题中的"zstd-jni-1.4.0-1.zip"表明这是一个关于Zstandard (Zstd)的Java Native Interface (JNI)库的压缩包,版本号为1.4.0,可能包含了一些修复和改进。这个库允许Java应用程序利用Zstd的高效压缩和解压缩算法,而...
完整的实现java跨平台调用C程序源码,包含JAVA源码和C源码以及编译后的demo dll。将dll放到jdk bin目录下,java 项目可以直接运行。若要修改dll可以,修改C源码后重新编译生成dll。该demo处理了多线程调用c,全局...
- **Java调用示例**:这些示例代码展示了如何在Java中加载和使用JNI库,调用GMSSL的加密、解密、签名和验证等功能。开发者可以通过阅读和运行这些示例来了解如何在自己的项目中集成GMSSL。 集成过程通常包括以下...
在本主题中,我们将深入探讨如何在Windows和Linux环境中利用JNI来生成动态链接库(DLL for Windows,SO for Linux),并使Java能够调用C++编写的函数。 1. **Java调用C++的基本原理** - JNI为Java应用程序提供了一...
这个"linux-java调用c语言编译的so动态库-jni例子-简单计算器"是一个典型的示例,展示了如何利用JNI来创建一个Java应用程序,该程序能够调用C编写的动态链接库(.so文件)进行计算操作。 JNI是Java平台的一部分,它...
Java通过JNI调用DLL动态库,亲测试编写
在Java中,我们使用`native`关键字标记这些方法,并通过`System.loadLibrary`加载相应的动态链接库(DLL或.so文件)来实现调用。 1. **JNI基础知识**: - **本地方法接口**:JNI定义了一组C/C++函数,这些函数在...
Java使用JNI(Java Native Interface)调用C++ DLL库是一种常见的技术,特别是在需要利用Java的跨平台特性同时利用C++的高效性能时。JNI提供了一种桥梁,使得Java代码能够直接与本地代码交互,比如C++编译的动态链接...
### 使用JNA替代JNI调用DLL,并解决内存溢出问题 #### 问题背景 在项目的开发过程中,常常遇到需要处理二进制流数据并对其进行解析处理的情况。这种情况下,如果上层应用平台采用的是Java开发,而底层算法或数据...
标题中的“JNA.jar-JNative.jar-dll创建-JAVA调用-VC调用”涉及到的是Java平台下通过JNI(Java Native Interface)的两种实现方式,JNA(Java Native Access)和JNative,来与C/C++编写的动态链接库(DLL)进行交互...