还是使用上次建好的Java项目,不同之处在于我们要在CentOS7中安装gcc,使用gcc进行编译。

先看看有没有g++,gcc命令:

gcc -v

如果看到一大串信息包括版本号,表示已经安装了gcc,否则执行下面的命令进行安装:

yum install glibc-static libstdc++-static -y

yum install gcc-c++

安装以后在检查一下。

创建文件夹/home/share/jnitest,以便我们把在Windows平台上使用Idea和Clion写好的代码复制进来进行处理。

好,现在我们把上次写好的java和C++文件复制到这个文件夹。我们不需要复制整个项目,Java项目我们复制源码文件夹就可以了,即com.chris.jnidemo的父文件夹。

[root@homeserver share]# cd jnitest
[root@homeserver jnitest]# ls
c  java

java放置的是java代码,c放置的是c++代码,代码都是上次在Windows开发环境写好的,我们现在只是在CentOS环境中编译和测试。

看看两个文件夹:

[root@homeserver jnitest]# cd java/
[root@homeserver java]# ll
总用量 0
drwxr-xr-x 3 root root 19 9月   7 22:21 com
[root@homeserver java]# cd ../c
[root@homeserver c]# ll
总用量 12
-rw-r--r-- 1 root root 125 9月   7 22:21 CMakeLists.txt
-rw-r--r-- 1 root root 215 9月   7 22:21 MyMathUtils.c
-rw-r--r-- 1 root root 508 9月   7 22:21 MyMathUtils.h
[root@homeserver c]#

那个txt文件应该是用不上的,有没有都没有关系。

现在我们要开始编译了。不过由于我的CentOS服务器安装的是openjdk,找不到include,所以只好删除openjdk,另外安装jdk1.8.

先看看是不是安装了openjdk,参考:。

rpm -qa | grep java

有XXXX_openjdk_XXX信息就表示有,如果没有信息表示没有安装。

删除openjdk:

rpm -e --nodeps `rpm -qa | grep java`

我们去官网下载一个最新的jdk包:jdk-8u181-linux-x64.tar.gz,在 CentOS中创建文件夹/root/app,输入rz,把jdk包从Windows导入进来。解压,改名。

cd /root/app

tar -zxvf jdk-8u181-linux-x64.tar.gz

mv jdk1.8.0_181 jdk1.8

执行pwd,修改环境变量,

pwd

vi /etc/profile

在最后添加如下内容:

## JAVA

export JAVA_HOME=/root/app/jdk1.8

export PATH=$PATH:$JAVA_HOME/bin

export CLASS_PATH=$JAVA_HOME/lib

保存退出,重新载入。

source /etc/profile

输入我们输入java –version,可以得到版本号信息。至此,我们的jdk就装好了。

顺便我们再来几步,把后面编译好的.so库文件统一放置在一个位置,在Java中使用的时候,我们就不用去处理路径问题了。

创建文件夹/root/jnilibs,并加入到环境变量:

cd /root

mkdir jnilibs

vi /etc/profile

在文件后面添加:

## jnilibs
export LD_LIBRARY_PATH=/root/jnilibs

保存退出后,执行source /etc/profile

此时准备工作完成我们可以进入编辑阶段了。

进入c文件的文件夹,编译MyMathUtils.c

[root@homeserver testjni]# cd /home/share/jnitest/c
[root@homeserver c]# g++ -I /root/app/jdk1.8/include -I /root/app/jdk1.8/include/linux -fPIC -shared -o libMyMath.so MyMathUtils.c
[root@homeserver c]# ll
总用量 20
-rw-r--r-- 1 root root  125 9月   7 22:21 CMakeLists.txt
-rwxr-xr-x 1 root root 7904 9月   7 22:53 libMyMath.so
-rw-r--r-- 1 root root  215 9月   7 22:21 MyMathUtils.c
-rw-r--r-- 1 root root  508 9月   7 22:21 MyMathUtils.h
[root@homeserver c]#

没有错误提示,文件夹下面也成功产生了一个libMyMath.so文件。

注意,编译命令:

g++ -I /root/app/jdk1.8/include -I /root/app/jdk1.8/include/linux -fPIC -shared -o libMyMath.so MyMathUtils.c

用的是g++,不是gcc,使用gcc会提示找不到符号,改成g++就行。

两个-I的参数是指明include两个.h文件的位置,这也就是我们重装jdk的原因。

我们把这个.so库文件放入我们刚才建好专用位置:

cp libMyMath.so /root/jnilibs/

进入Java文件夹,编译java文件。不过编译之前,我们要改一下库的名称。

[root@homeserver c]# cd ../java/com/chris/jnidemo

[root@homeserver java]# vi MyMathUtils.java
package com.chris.jnidemo;

public class MyMathUtils {
    static {
        System.loadLibrary("MyMath");
    }

    public static native int getSum(int a, int b);
}

注意,前面编译的时候,加在前面的“lib”是必须的,而在引用库的时候,lib三个字母要去掉。

编译java文件。

[root@homeserver jnidemo]# javac *
[root@homeserver jnidemo]# ls
JniTest.class  JniTest.java  MyMathUtils.class  MyMathUtils.java

运行JniTest:

[root@homeserver jnidemo]# cd ../../..
[root@homeserver java]# java com.chris.jnidemo.JniTest
38259

注意看着是在哪里执行的?是的,要退出到源码根目录去执行。