Java JNI调用so动态链接库

时间:2021-12-04 15:48:20

参考 https://segmentfault.com/a/1190000000658143 可能我的步骤更流畅一些哈哈


有个业务要做对西加加的调用,自己先了解了一下,记一下所得和步骤,注意copy代码的时候修改路径等,要不容易报UnsatisfiedLinkError那就是找不到对应的native方法

1. Java调用

package sf.gg;

public class Hello{

public native static int add(int x,int y); //java 代码中声明 native 方法

static {
    System.load("/home/lance/main.so");  //以绝对路径加载so文件  
}

public static void main(String[] args){  
    System.out.println(add(1,1));    
}

}


2. 编译java代码(生成.class)

javac -d . Hello.java


3.生成.h文件

先cd到Sources Root目录下,一般是项目的com(这里的例子是sf)的父目录,然后使用javah

javah sf.gg.Hello 

4.回到原目录,可以同时把.h mv过来,编写实现add方法的C代码

#include<stdio.h>
#include "sf_gg_Hello.h"

JNIEXPORT jint JNICALL Java_sf_gg_Hello_add(JNIEnv *env, jclass jc, jint x, jint y){
    return x+y;   //简单的加法
}

5.生成.o文件

第一个-I从%JAVA_HOME%/include找到jni.h,第二个-I从%JAVA_HOME%/include/linux找到jni_md.h,不加这两个参数看报错信息就明白了

gcc -fPIC -D_REENTRANT -I/home/xjs/bin/jdk1.7.0_80/include -I/home/xjs/bin/jdk1.7.0_80/include/linux -c hello.c

6.生成.so

gcc hello.o -o main.so -shared 


7.注意别忘了把生成的.so的路径和java里load的路径对应好

8.运行

java sf.gg.Hello