1.    确保Linux已经装好gcc g++

2.    确保Linux 已经装好jdk

3.    在Linux中安装可以同时开发C/C++与Java的eclipse

4.    Eclipse的工作路径 workspace为:/home/Hadoop/WorkspaceKepler

5.    在Eclipse创建Java项目TestJNIJava ,创建包com.jni.test.并创建类HelloWorld.java

packagecom.jni.test;

 

publicclass HelloWorld {

    //定义一个本地方法

         publicnative String sayHello();

         static{

//调用动态链接库

                   System.loadLibrary("helloworld");

         }

         publicstaticvoid main(String[] args) {

                       String str =new HelloWorld().sayHello();

                       System.out.println("java--->"+ str);

         }

 

6.    }保存代码后,会在/home/Hadoop/WorkspaceKepler/TestJNIJava/bin/com/jni/test中产生文件HelloWorld.class

7.    进入终端,用javah命令生成.h文件

cd /home/Hadoop/WorkspaceKepler/TestJNIJava/bin

javah com.jni.test.HelloWorld

命令执行后会在目录/home/Hadoop/WorkspaceKepler/TestJNIJava/bin 中产生

com_jni_test_HelloWorld.h 文件

如果.h文件的权限是root,那么执行一下命令更改权限

sudo chmod 777 com_jni_demo_HelloJNI.h

8.    在Eclipse创建C++项目TestJNICPP 并创建src文件夹

9.    C++项目的目录为/home/Hadoop/WorkspaceKepler/TestJNICPP/src

10.  把生成的com_jni_test_HelloWorld.h 文件拷贝到C++项目的src下,并创建HelloWorld.cpp文件。

拷贝之后.h头文件可能会报错,是因为没有包含jdk中的include文件夹,详见下图

Linux中Eclipse下JNI示例

Linux中Eclipse下JNI示例

路径为:/usr/lib/jvm/java-6-openjdk-amd64/include

/*

 * HelloWorld.cpp

 *

 * Created on: 2018年3月22日

 *     Author: hadoop

 */

 

#include "com_jni_test_HelloWorld.h"

#include<stdio.h>

JNIEXPORTjstring  JNICALLJava_com_jni_test_HelloWorld_sayHello(JNIEnv *env,jobject thiz)

{

    char*p="Hello Java";

        jstring str = env->NewStringUTF(p);

        printf("c --->  Hello World I am C++\n");

        return str ;

}

11.  本地方法生成动态链接库

进入目录 /home/Hadoop/WorkspaceKepler/TestJNICPP/src  输入命令:

g++ -shared -fPIC -I /usr/lib/jvm/java-6-openjdk-amd64/include HelloWorld.cpp-o

libhelloworld.soLinux中Eclipse下JNI示例

注意:

① 编译时的选项-fPIC,表示创建与地址无关的编译程序(pic,position independent code),是为了能够在多个应用程序间共享。

② 生成动态库,此时要加链接器选项-shared,指定生成动态链接库。③ 在 java 程序中,加载库:System.loadLibrary("hellojni"),库名不加 lib,如果是 libhellojni.so,就是 loadLibrary("hellojni")

执行完命令后会在/home/Hadoop/WorkspaceKepler/TestJNICPP/src目录下生成

libhelloworld.so文件

sudo chmod777 libhellojni.so 更改.so文件权限

12.  最后刷新一下项目,最后的目录结构这样子,然后运行HelloWorld.java,控制台输出如下信息。

开始运行会报错

Linux中Eclipse下JNI示例

Exception in thread "main"java.lang.UnsatisfiedLinkError: no hellojni in java.library.path

这需要在Java项目上右键->Java Build Path->Libraries->Native library location中添加动态库的目录。/home/hadoop/WorkspaceKepler/HelloJNICPP/src

相关文章: