linux/Ubuntu 下使用 java 调用 so 动态链接库详细步骤

时间:2022-05-06 06:48:04

本文章介绍的方法为小弟查找资料摸索出来的,为方便以后学习使用,同时提供给刚接触 JNI 的小白一个 demo

文中有错误的概念请大神们不吝教诲~~~


1、编写 java 类,先上代码

package com.hongquan.jni;

public class HelloJNI {

// 声明 so 库中的方法
public native static String sayHi(String name);

// 载入 so 动态链接库
static {
System.load("/home/hongquan/main.so");
}

// java 类入口函数
public static void main(String[] args) {
System.out.println(sayHi("It's a result return by main.so file!!"));
}

}

需要注意的有一点,java 类中的包名需要有对应的层级关系
比如上述代码中的包名为 com.hongquan.jni,终端的默认工作目录为 /home/username/
那么,在 /home/username/ 下需要建立 com 文件夹,com 文件夹下建立 hongquan 文件夹,然后 hongquan 下建立 jni 文件夹,jni 文件夹中存放 HelloJNI.java 类文件
当然,你可以将 /home/username/ 更换为任意你想要使用的工作目录,但是必须保证的是工作目录下能通过java类的完整包名找到该类


代码部分就没什么可以说的了,我们在 so 动态链接库中需要实现的函数为 sayHI(String name),该函数会把我们传入的字符串直接返回给我们,功能就这么简单
其中载入动态链接库的代码有两种实现方式
a、System.load("/home/hongquan/main.so");// 这种方式需要提供 so 文件所在的绝对路径
b、System.loadLibrary("main");// 传入 so 文件的文件名就可以了,不需要后缀(这种没实践过,网上一搜大把),不过这种方式需要把生成的 so 动态链接库复制到 java 的 lib 加载路径中,即 LD_LIBRARY_PATH 对应的路径
给大家找来了修改 LD_LIBRARY_PATH 路径的方法,打开 etc/profile 文件
在下面添加 LD_LIBRARY_PATH=/home/username/ 这样就可以直接使用 loadLibrary 函数夹在 /home/username 目录下的 so 动态链接库了


2、编译 java 类
终端中执行

javac com/hongquan/jni/HelloJNI.java
会在 HelloJNI.java 同级目录下生成 HelloJNI.class


3、使用 class 文件生成 .h 头文件
终端中执行 

javah com.hongquan.jni.HelloJNI
会在 /home/hongquan 目录下生成 com_hongquan_jni_HelloJNI.h 的头文件


4、编写 hello.c 源文件,代码如下
#include "stdio.h"
#include "com_hongquan_jni_HelloJNI.h"


JNIEXPORT jstring JNICALL Java_com_hongquan_jni_HelloJNI_sayHi(JNIEnv *env, jclass jc, jstring name)
{
return name;
}
引入第 3 步中生成的头文件,并实现其中声明的函数
函数内容很简单,直接将传入的 name 返回(其实主要是小弟不懂 c 啊,不敢献丑~ 哈哈哈)


5、使用如下命令生成 .o 文件
gcc -fPIC -D_REENTRANT -I/usr/local/java/jdk1.7.0_40/include -I/usr/local/java/jdk1.7.0_40/include/linux -c hello.c
需要注意的是
/usr/local/java/jdk1.7.0_40/include
/usr/local/java/jdk1.7.0_40/include/linux
是 jdk 中的 jni.h 文件的所在目录,这两个目录需要大家替换为自己的对应路径
成功的话会在 /home/hongquan 目录下生成 hello.o 文件


6、大功告成啦
最后执行 
gcc hello.o -o main.so -shared
这样就在 /home/hongquan 目录下生成了名为 main.so 的动态链接库了


7、接下来我们来试试是否能够调用成功
执行 class 文件进行测试 
java com.hongquan.jni.HelloJNI
能够看到返回 It's a result return by main.so file!!


linux 下使用 java 调用 so 动态链接库就成功了!Goodluck every one!!

------------------------------------------------------------------------------------------------------

android 调用 so 动态链接库文章请移步 >> http://blog.csdn.net/hongquan1991/article/details/12449381