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

 

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 
#include "TestMain.h"

using namespace std;

JNIEXPORT void JNICALL Java_TestMain_Hello
  (JNIEnv *, jclass)
{
    cout << "Hello,zcy!" << endl;
}

 

5、修改TestMain.h头文件路径。将 #include 修改为 #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、执行。结果为:

自己实现一个Native方法(linux版)_第1张图片

 

 


 

你可能感兴趣的:(Java)