还是使用上次建好的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
注意看着是在哪里执行的?是的,要退出到源码根目录去执行。