转自http://www.matrix.org.cn/
摘要:
本文将解释使用Java调用C或C++动态链接库的过程和方法。
用JNI调用C或C++动态联接库原来如此简单
因工作的缘故,有机会接触了Java本地方法调用(JNI)。本文中记下了初试JNI的过程和一点点体会。
使用Java的JNI调用C/C++的动态联结库有个固定的步骤,下面将以一个最简单的HelloWorld例子程序来说明调用过程。这个HelloWorld的例子只是简单的显示HelloWorld消息。
第一步 编写Java类
首先,我们创建一个名为jnitest的Eclipse工程,并新建一个src源代码目录。
这里我们编写两个Java类,一个命名为HelloWorld,一个命名为TestDLL。HelloWorld类包含一个本地方法displayHelloWorld(),TestDLL用于测试这个本地方法。HelloWorld的源码清单如下:
List1. HelloWorld.java源码
public class HelloWorld {
public native void displayHelloWorld();①
static{
System.loadLibrary("HelloWorld"); ②
}
}
TestDLL源码如下:
List2. TestDLL.java源码
public class TestDLL {
public static void main(String[] args){
HelloWorld helloWorld = new HelloWorld();
helloWorld.displayHelloWorld();
}
}
说明:①是java本地方法申明;②装入动态链接库,"HelloWorld"是要装入的动态链接库名称。
第二步 编译Java类
在Eclipse工具中编译Java类。编译后的class文件会自动放入工程目录下的bin目录中。
第三步 生成C/C++头文件
在windows中打开一个命令窗口,进入jnitest工程所在目录下的bin目录如:D:\workspace\jnitest\bin。键入javah -classpath D:\workspace\jnitest\bin HelloWorld命令生成头文件HelloWorld.h。内容如下:
List3. HelloWorld.h源码
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */
#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloWorld
* Method: displayHelloWorld
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
注意,不要修改这个头文件。
第四步 编写本地方法实现
用VC6创建HelloWorld Win32动态链接库工程。将上述生成的头文件HelloWorld.h拷贝到
D:\Program Files\Microsoft Visual Studio\MyProjects\HelloWorld目录下面。
将D:\j2sdk1.4.2\include目录下的jni.h和D:\j2sdk1.4.2\include\win32\jni_md.h两个头文件拷贝到VC安装目录下的D:\Program Files\Microsoft Visual Studio\VC98\Include目录下面。在VC IDE中新建HelloWorld.cpp文件,实现头文件中声明的方法并编译生成DLL。
List4. HelloWorld.cpp源码
#include "HelloWorld.h"
#include <stdio.h>
/*
* Class: HelloWorld
* Method: displayHelloWorld
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
(JNIEnv *, jobject)
{
printf("Hello World!\n");
return;
}
第五部 运行测试程序
先将生成的DLL拷贝到jnitest工程的D:\workspace\jnitest\bin下面,然后设置DLL搜索路径(环境变量PATH)为D:\workspace\jnitest\bin(JNI并没有规定必须将dll放在与class文件相同的目录,只要确保JVM能搜索到DLL即可)③。重新启动Elipse后,运行测试程序,将看到控制台输出“Hello World!”
注意,③必须设置好DLL搜索路径,或者将dll拷贝到C:\WINDOWS\system32下面。这里,我折腾了不少时间,才搞定。
参考资料
http://java.sun.com/docs/books/tutorial/information/download.html源代码下载
分享到:
相关推荐
### JNI调用C++动态链接库入门:详细解析与实践指南 #### 一、引言 Java Native Interface(JNI)是Java平台提供的一种强大的机制,它允许Java代码调用本地的C或C++代码,从而利用这些语言在性能、系统访问等方面...
springboot环境下java调用c程序生成动态链接库(.so文件),并调用(基于JNI,Ubuntu)C++是一种广泛使用的编程语言,它是由Bjarne Stroustrup于1979年在新泽西州美利山贝尔实验室开始设计开发的。C++是C语言的...
JNI是java调用C++程序的一种实现方法,网上有一些相关的资料,但不一定能适用,这个文档我在学习JNI时综合网上资料总结的,本人亲测能够实现,希望下载的网友有什么问题多多反馈,希望对学习JNI的朋友有所帮助
JNI开发Java和C/C++互相传递List集合, 可以参考: Java从C/C++获取List集合对象:https://blog.csdn.net/niuba123456/article/details/80994166 Java传递List集合对象到C/C++ ...
JNI在Android开发中尤为重要,特别是在需要调用C/C++原生代码以提升性能或者利用现有库时。本教程“JNI入门Demo3.0”主要针对的是JNI的动态注册Native函数这一核心概念。 首先,我们需要理解什么是JNI。JNI是一种...
JNI在Android开发中扮演着重要角色,尤其当开发者需要利用C/C++库或优化性能时。而NDK(Native Development Kit)是Google提供的一套工具集,它使得开发者能够在Android应用中集成本地代码,从而利用JNI来调用C/C++...
- 加载动态链接库:使用`System.loadLibrary()`在Java代码中加载C++编译生成的动态链接库(.dll或.so文件)。 3. **C++调用Java**: - 获得Java对象引用:通过JNIEnv,可以获取到Java对象的本地引用,进而调用其...
Android应用程序(APK)怎样通过JNI调用Native C/C++实现的共享库。Android系统的Java虚拟机为C和C++实现两套不同的API,本工程分别对其作出示例程序。并编译出libhelloworld.so/libhelloworldcpp.so共享库
4. **编译C/C++代码**:使用编译器(如gcc)将C/C++代码编译成动态链接库。 ``` gcc -shared -o libNativeExample.so -I/usr/lib/jvm/java-8-openjdk-amd64/include -I/usr/lib/jvm/java-8-openjdk-amd64/include/...
- **动态链接库**:将C/C++代码编译成动态链接库(Windows上的.dll,Linux上的.so,MacOS上的.dylib)。 4. **加载本地方法** - **Java端注册**:在Java类中使用`System.loadLibrary`加载本地库,`...
最后,编译C/C++代码生成动态链接库(DLL或SO),并在Java代码中使用`System.loadLibrary`加载这个库,这样Java就可以调用C/C++实现的本地方法了。在运行Java程序时,JNI方法会被自动调用,从而实现了Java与C/C++的...
- **代码复用**:对于已经存在的C/C++库,例如文件压缩库或人脸识别库,可以通过JNI在Java项目中直接调用,减少重复编写代码的工作量。 - **特殊业务场景**:例如,OpenCV库可以用于实时图像处理(如人脸识别),...
4. **编译C++代码为动态库**:使用NDK(Native Development Kit)编译C++源代码为Android平台上的动态链接库(`.so`文件)。这通常涉及设置Android.mk或CMakeLists.txt文件,然后运行`ndk-build`或使用Android ...
- 使用NDK(Native Development Kit)编译C/C++源代码为动态链接库(.so文件),可以使用NDK提供的构建系统如`ndk-build`或CMake。 - 链接时确保链接了`libjvm.so`库,这是Java运行时环境的一部分。 6. **在...
4. 动态链接库:学习如何加载和使用动态库(.so文件),以实现按需加载或更新原生代码。 通过这个项目,你将能够建立起对Android NDK和JNI的坚实理解,并具备实际开发能力。记住,实践是最好的老师,动手操作并不断...
与`JNI_OnLoad`相对应,`JNI_OnUnload`函数在卸载动态链接库时被调用,主要用于释放资源或执行清理操作。 #### 五、总结 通过上述介绍可以看出,JNI在Android开发中起到了关键作用。它不仅有助于提高应用性能,还...
4. **编译和链接**:将C/C++代码编译成动态链接库或静态库,并将其与Java程序链接起来。 5. **加载和调用**:运行时,Java虚拟机会加载所需的库,并调用相应的本地方法。 #### 三、JNI示例分析 1. **Java类声明**:...
在Android开发中,NDK(Native Development Kit)是一个重要的工具集,它允许开发者使用C/C++语言编写部分或全部应用程序,以实现高性能计算或者利用已有的C/C++库。本项目是一个关于Android NDK入门的实例,展示了...
使用Android Studio的`Generate Signed Bundle / APK`或`Build > Generate Signed Bundle / APK`命令,系统会自动调用`ndk-build`或`cmake`来编译C++代码,并生成相应的`.so`库文件。同时,Android Studio也会自动...
JNI,即Java Native Interface,是Java平台的一部分,自Java 1.1开始引入,它的主要目的是为了让Java代码能够与用其他编程语言(如C和C++)编写的本地代码进行交互。虽然这种交互可能导致平台可移植性的降低,但在...