java调用c++动态库dll
来源:互联网 发布:剪辑声音的软件 编辑:程序博客网 时间:2024/06/05 04:25
本文讲述如何使用JNI技术实现HelloWorld,目的是让读者熟悉JNI的机制并编写第一个HelloWorld程序。
Java Native Interface(JNI)是Java语言的本地编程接口,是J2SDK的一部分。在java程序中,我们可以通过JNI实现一些用java语言不便实现的功能。通常有以下几种情况我们需要使用JNI来实现。
标准的java类库没有提供你的应用程序所需要的功能,通常这些功能是平台相关的
你希望使用一些已经有的类库或者应用程序,而他们并非用java语言编写的
程序的某些部分对速度要求比较苛刻,你选择用汇编或者c语言来实现并在java语言中调用他们
在《java核心技术》中,作者提到JNI的时候,建议不到万不得已不要使用JNI技术,一方面它需要你把握更多的知识才可以驾驭,一方面使用了JNI你的程序就会丧失可移植性。在本文我们跳过JNI的底层机制,读者最好先把它想象为本地代码和java代码的粘合剂
下面我们开始编写HelloWorld程序,由于涉及到要编写c/c++代码因此我们会在开发中使用Microsoft VC++工具。
编写java代码
我们在硬盘上建立一个hello目录作为我们的工作目录,首先我们需要编写自己的java代码,在java代码中我们会声明native方法,代码非常简单。如下所示
class HelloWorld
{
public native void displayHelloWorld();
static {
System.loadLibrary("hello");
}
public static void main(String[] args) {
new HelloWorld().displayHelloWorld();
}
}
注重我们的displayHelloWorld()方法的声明,它有一个要害字native,表明这个方法使用java以外的语言实现。方法不包括实现,因为我们要用c/c++语言实现它。注重System.loadLibrary("hello")这句代码,它是在静态初始化块中定义的,系统用来装载hello共享库,这就是我们在后面生成的hello.dll(假如在其他的操作系统可能是其他的形式,比如hello.so)
编译java代码
javac HelloWorld.java 生成HelloWorld.class文件
创建.h文件
这一步中我们要使用javah命令生成.h文件,这个文件要在后面的c/c++代码中用到,我们运行
javah HelloWorld。这样我们可以看到在相同目录下生成了一个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
编写本地实现代码
在这部分我们要用C/C++语言实现java中定义的方法,我们在VC++中新建一个Project,然后创建一个HelloWorldImp.cpp文件,内容如下
#include <jni.h>
#include "HelloWorld.h"
#include <stdio.h>
JNIEXPORT void JNICALL
Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)
{
printf("Hello world!/n");
return;
}
注重我们这里include了 jni.h和刚才得到的HelloWorld.h文件。因此你要在VC++里面设置好,jni.h在JAVA_HOME/include里面。编译通过后再生成hello.dll文件。
运行java程序
把上面生成的hello.dll文件复制到我们的工作目录,这时候我们的目录中包括HelloWorld.java,HelloWorld.class和hello.dll文件。运行java HelloWorld命令,则可在控制台看到Hello world
的输出了。
注:1、使用javah编译HelloWorld是应该在src下 使用javah -jni 包名.HelloWorld
2、文中的加载方式
static {
System.loadLibrary("hello");
}
如hello.dll或hello.so文件不在 path环境变量的文件中 会有 异常 java.lang.UnsatisfiedLinkError:no xxxxxx in java.library.path
解诀方案1、将hello.dll或hello.so 放到 环境变量的任意目录中
2、参考http://blog.csdn.net/iamfafa/article/details/6340057
- java 调用 dll动态库
- JNA调用C动态库dll、so
- java如何调用dll:用JNI调用C或C++动态联接库原来如此简单
- java调用动态库(.dll或.so)
- Java调用C++动态库dll
- java调用动态链接库(dll)
- java调用c++动态库dll
- JNI java调用动态链接库dll
- java调用dll动态库方法
- Java通过JNI调用DLL动态库
- java调用动态库dll文件
- Java调用dll动态库-笔记
- JAVA调用动态链接库(dll)
- 使用Java调用dll动态链接库
- java调用dll动态库文件方法
- java调用动态链接库 dll
- C#动态调用C++DLL
- Java使用JNI调用C/C++的DLL动态链接库1
- GCC内嵌汇编
- 关于TLD工程在VS2010下运行的修改
- 【LeetCode】Pascal's Triangle (杨辉三角)
- Ad Hoc Distributed Queries的启用与关闭
- Redis Sentinel 源码分析
- java调用c++动态库dll
- 一个文件中有40亿个整数,求出这个文件里的整数里不包含的一个整数
- 最小生成树
- Firefox保存网页预览模式下的图片方法
- c++中的explicit关键字及隐式类型转换
- C++中有关内存的思考
- 在一个文件中有10G个整数,乱序排列,要求找出中位数
- ITK VTK CTK QT 跨平台联合开发之 四 <Mac OS X篇>
- 递归--阶乘