本文章介绍的方法为小弟查找资料摸索出来的,为方便以后学习使用,同时提供给刚接触 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"引入第 3 步中生成的头文件,并实现其中声明的函数
#include "com_hongquan_jni_HelloJNI.h"
JNIEXPORT jstring JNICALL Java_com_hongquan_jni_HelloJNI_sayHi(JNIEnv *env, jclass jc, jstring name)
{
return name;
}
函数内容很简单,直接将传入的 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