`
jiaoyingjun
  • 浏览: 20845 次
  • 性别: Icon_minigender_1
  • 来自: 安徽
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

用JNI调用C或C++动态联接库入门

阅读更多
转自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++动态链接库入门

    ### JNI调用C++动态链接库入门:详细解析与实践指南 #### 一、引言 Java Native Interface(JNI)是Java平台提供的一种强大的机制,它允许Java代码调用本地的C或C++代码,从而利用这些语言在性能、系统访问等方面...

    springboot环境下java调用c程序生成动态链接库(.so文件),并调用(基于JNI,Ubuntu).zip

    springboot环境下java调用c程序生成动态链接库(.so文件),并调用(基于JNI,Ubuntu)C++是一种广泛使用的编程语言,它是由Bjarne Stroustrup于1979年在新泽西州美利山贝尔实验室开始设计开发的。C++是C语言的...

    JNI快速实现入门(java调用C++程序的方法)

    JNI是java调用C++程序的一种实现方法,网上有一些相关的资料,但不一定能适用,这个文档我在学习JNI时综合网上资料总结的,本人亲测能够实现,希望下载的网友有什么问题多多反馈,希望对学习JNI的朋友有所帮助

    JNI开发Java和C/C++互相传递List集合

    JNI开发Java和C/C++互相传递List集合, 可以参考: Java从C/C++获取List集合对象:https://blog.csdn.net/niuba123456/article/details/80994166 Java传递List集合对象到C/C++ ...

    JNI入门Demo3.0

    JNI在Android开发中尤为重要,特别是在需要调用C/C++原生代码以提升性能或者利用现有库时。本教程“JNI入门Demo3.0”主要针对的是JNI的动态注册Native函数这一核心概念。 首先,我们需要理解什么是JNI。JNI是一种...

    Android Studio JNI开发入门教程

    JNI在Android开发中扮演着重要角色,尤其当开发者需要利用C/C++库或优化性能时。而NDK(Native Development Kit)是Google提供的一套工具集,它使得开发者能够在Android应用中集成本地代码,从而利用JNI来调用C/C++...

    教你java和C++的jni编程

    - 加载动态链接库:使用`System.loadLibrary()`在Java代码中加载C++编译生成的动态链接库(.dll或.so文件)。 3. **C++调用Java**: - 获得Java对象引用:通过JNIEnv,可以获取到Java对象的本地引用,进而调用其...

    Android JNI开发入门之C/C++实现示例程序

    Android应用程序(APK)怎样通过JNI调用Native C/C++实现的共享库。Android系统的Java虚拟机为C和C++实现两套不同的API,本工程分别对其作出示例程序。并编译出libhelloworld.so/libhelloworldcpp.so共享库

    jni开发入门+深入

    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/...

    java jni从入门到精通

    - **动态链接库**:将C/C++代码编译成动态链接库(Windows上的.dll,Linux上的.so,MacOS上的.dylib)。 4. **加载本地方法** - **Java端注册**:在Java类中使用`System.loadLibrary`加载本地库,`...

    JNI入门教程之HelloWorld篇

    最后,编译C/C++代码生成动态链接库(DLL或SO),并在Java代码中使用`System.loadLibrary`加载这个库,这样Java就可以调用C/C++实现的本地方法了。在运行Java程序时,JNI方法会被自动调用,从而实现了Java与C/C++的...

    C入门&&JNI;

    - **代码复用**:对于已经存在的C/C++库,例如文件压缩库或人脸识别库,可以通过JNI在Java项目中直接调用,减少重复编写代码的工作量。 - **特殊业务场景**:例如,OpenCV库可以用于实时图像处理(如人脸识别),...

    JNI入门Demo1.0

    4. **编译C++代码为动态库**:使用NDK(Native Development Kit)编译C++源代码为Android平台上的动态链接库(`.so`文件)。这通常涉及设置Android.mk或CMakeLists.txt文件,然后运行`ndk-build`或使用Android ...

    JNI入门Demo2.0

    - 使用NDK(Native Development Kit)编译C/C++源代码为动态链接库(.so文件),可以使用NDK提供的构建系统如`ndk-build`或CMake。 - 链接时确保链接了`libjvm.so`库,这是Java运行时环境的一部分。 6. **在...

    Android ndk jni 史上最强NDK入门项目实战

    4. 动态链接库:学习如何加载和使用动态库(.so文件),以实现按需加载或更新原生代码。 通过这个项目,你将能够建立起对Android NDK和JNI的坚实理解,并具备实际开发能力。记住,实践是最好的老师,动手操作并不断...

    Android下JNI入门详解

    与`JNI_OnLoad`相对应,`JNI_OnUnload`函数在卸载动态链接库时被调用,主要用于释放资源或执行清理操作。 #### 五、总结 通过上述介绍可以看出,JNI在Android开发中起到了关键作用。它不仅有助于提高应用性能,还...

    JNI 入门初级教程

    4. **编译和链接**:将C/C++代码编译成动态链接库或静态库,并将其与Java程序链接起来。 5. **加载和调用**:运行时,Java虚拟机会加载所需的库,并调用相应的本地方法。 #### 三、JNI示例分析 1. **Java类声明**:...

    android NDK入门篇----混合使用java和c/c++代码 源码工程

    在Android开发中,NDK(Native Development Kit)是一个重要的工具集,它允许开发者使用C/C++语言编写部分或全部应用程序,以实现高性能计算或者利用已有的C/C++库。本项目是一个关于Android NDK入门的实例,展示了...

    Android Studio jni开发之经典入门demo

    使用Android Studio的`Generate Signed Bundle / APK`或`Build &gt; Generate Signed Bundle / APK`命令,系统会自动调用`ndk-build`或`cmake`来编译C++代码,并生成相应的`.so`库文件。同时,Android Studio也会自动...

    JNI入门

    JNI,即Java Native Interface,是Java平台的一部分,自Java 1.1开始引入,它的主要目的是为了让Java代码能够与用其他编程语言(如C和C++)编写的本地代码进行交互。虽然这种交互可能导致平台可移植性的降低,但在...

Global site tag (gtag.js) - Google Analytics