Java JNI调用so动态链接库

来源:互联网 发布:装修省钱 知乎 编辑:程序博客网 时间:2024/06/09 18:59

参考 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




原创粉丝点击