Java使用JNI调用C++实现Hello jni
2015-09-11 09:14
453 查看
先说几句题外话,这是我的第一篇博客,现在还是小菜鸟一只,最近在实习, 上个月老大布置了个任务,让写个小程序,实现在Windows下对一个文件是否被占用进行判断。让使用jni去调底层的代码,当时任务很轻松地就完成了。可是前几天同学也遇到要用java调用c++代码的情况,让我帮她看下程序,顿时还有点懵逼,竟然这么快就忘得一干二净,又得上网去查,简直不能忍,于是还是觉得写写博客吧,一方面记录一下自己平时的工作内容,一方面也希望和大神们多交流交流,好吧,开始进入正题。
JNI是Java
Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他编程语言,只要调用约定受支持就可以了。使用java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的。例如,使用一些旧的库,与硬件、操作系统进行交互,或者为了提高程序的性能。
第一步,编写java类。
然后将JniHello编译生成JniHello.class。
第二步,生成JniHello.h文件,完成后会在工作目录下生成JniHello.h头文件。
第三步,编写C++.生成dll文件。
a)在头文件处右键选择添加现有项,选择前面生成的JniHello.h文件
注:此时可能出现问题“#include
<jni.h>” 找不到jni.h的引用。解决方法,将jdk安装目录下的include文件夹中
的“jni.h”,及当前文件夹下win32文件夹中“jni_md.h”、“jawt_md.h”,共3个文件,拷入VS2010安装目录下的“/VC/include/”文件夹中。
b)打开stdafx.h文件,在末尾添加如下代码:
c)编写jniWin32.cpp,代码如下
d)点击运行,生成jniWin32.dll文件(在Debug目录下)
第四步,部署dll,运行java程序。
a)将jniWin32.dll文件拷贝至JniWin32.class同目录下
注:若出现以下异常
即需要将jniWin32.dll文件拷贝至系统可检测的PATH路径中,其路径可以再环境变量中或使用以下代码查看。
b)运行代码,查看结果。
JNI是Java
Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他编程语言,只要调用约定受支持就可以了。使用java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的。例如,使用一些旧的库,与硬件、操作系统进行交互,或者为了提高程序的性能。
第一步,编写java类。
public class JniHello { public native void hello(); static { System.loadLibrary("jniWin32"); } public static void main(String[] args) { JniHello jniHello = new JniHello(); jniHello.hello(); } }
然后将JniHello编译生成JniHello.class。
第二步,生成JniHello.h文件,完成后会在工作目录下生成JniHello.h头文件。
第三步,编写C++.生成dll文件。
a)在头文件处右键选择添加现有项,选择前面生成的JniHello.h文件
注:此时可能出现问题“#include
<jni.h>” 找不到jni.h的引用。解决方法,将jdk安装目录下的include文件夹中
的“jni.h”,及当前文件夹下win32文件夹中“jni_md.h”、“jawt_md.h”,共3个文件,拷入VS2010安装目录下的“/VC/include/”文件夹中。
b)打开stdafx.h文件,在末尾添加如下代码:
#include "JniHello.h"
c)编写jniWin32.cpp,代码如下
#include "stdafx.h" JNIEXPORT void JNICALL Java_JniHello_hello(JNIEnv *, jobject){ printf("Hello jni!"); };
d)点击运行,生成jniWin32.dll文件(在Debug目录下)
第四步,部署dll,运行java程序。
a)将jniWin32.dll文件拷贝至JniWin32.class同目录下
注:若出现以下异常
java.lang.UnsatisfiedLinkError: no XXX in java.library.path
即需要将jniWin32.dll文件拷贝至系统可检测的PATH路径中,其路径可以再环境变量中或使用以下代码查看。
/** * 获取系统PATH */ public class GetSysPath { public static void main(String[] args) { // 类路径 String str = System.getProperty("java.library.path"); System.out.println(str); } }
b)运行代码,查看结果。
相关文章推荐
- 项目1--C/C++语言中函数参数传递的三种方式
- C++语言中函数参数传递的三种方式
- 第2周项目1 C/C++语言中函数参数传递的三种方式
- 第一周项目 — C/C++语言中函数参数传递的三种方式
- 第二周项目1—C/C++语言中函数参数传递的三种方式
- C语言中函数参数传递的三种方式
- 【第2周 项目3 - 体验复杂度(两种排序算法的运行时间)】
- C语言入门小知识
- 第二周项目1--C++语言中函数参数传递的三种方式
- 项目2 - 程序的多文件组织
- 第2周项目1-C/C++语言中函数参数传递的三种方式
- 第二周 项目1-C/C++语言中函数参数传递的三种方式
- 第2周项目1-C/C++语言中函数参数传递的三种方式
- c++指针存储应用程序和释放内存的问题
- Effective C++ —— 让自己习惯C++(一)
- 第2周 项目1-C/C++语言中函数参数传递的三种方式
- 第二周项目1 - C/C++语言中函数参数传递的三种方式
- 第二周 项目1-C/C++语言中函数参数传递的三种方式
- 项目1-C语言中函数参数传递的三种方式
- RAII惯用法:C++资源管理的利器