参考 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
先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
8.运行
java sf.gg.Hello