自己实现一个Native方法(linux版)

来源:互联网 发布:aerial for windows 编辑:程序博客网 时间:2024/04/29 10:03

参照五月的仓颉的windows版本实现。http://www.cnblogs.com/xrq730/p/4824024.html


JNI

Java的不足体现在运行速度要比传统的C++慢上许多之外,还有Java无法直接访问到操作系统底层如硬件系统,为此Java提供了JNI来实现对于底层的访问。JNI,Java Native Interface,它是Java的SDK一部分,JNI允许Java代码使用以其他语言编写的代码和代码库,本地程序中的函数也可以调用Java层的函数,即JNI实现了Java和本地代码间的双向交互。


Native

JDK开放给用户的源码中随处可见Native方法,被Native关键字声明的方法说明该方法不是以Java语言实现的,而是以本地语言实现的,Java可以直接拿来用。本地语言这四个字,应该就是可以和操作系统直接交互的语言

 

通过JNI调用C++写的代码

下面演示一下如何写一段简单的C++代码,在Java中用一个Native方法去调用的步骤。接下来一步一步演示一下:

1、写一段Java代码。由于我们在linux环境下,所以用的是一个.so文件。最后C++代码写完之后要生成一个.so文件,生成的文件可以使用static动态加载的方法加载进来,也可以通过配置环境变量的方式,这里选择前者。

public class TestMain{    static    {        System.load("/tmp/test/Hello.so");    }    public native static void Hello();    public static void main(String[] args)    {        Hello();    }}
2、编译java代码:javac TestMain.java

3、运行:“javah -jni TestMain”,表示为指定的类下的Native方法生成.h文件。.h文件是C/C++使用的头文件。此时在该目录下会生成一个TestMain.h头文件,这个命名是javah这个命令的实现帮我们命名的,只要多了这个文件就可以了。

4、然后在该目录下添加Hello.cpp源文件。文件内容为:

#include <iostream>#include "TestMain.h"using namespace std;JNIEXPORT void JNICALL Java_TestMain_Hello  (JNIEnv *, jclass){    cout << "Hello,zcy!" << endl;}

5、修改TestMain.h头文件路径。将 #include <jin.h> 修改为 #include "/usr/lib/jvm/java-1.7.0-openjdk-amd64/include/jni.h",后者是在linux下安装jar的安装位置。

6、编译C++源码为动态库。g++ Hello.cpp -fpic -shared -o Hello.so

7、经过上面一步,在源码目录下会生成Hello.so动态库文件。

8、执行。结果为:








0 0
原创粉丝点击