基本思路:A.so(支持JNI)、B.so(不支持JNI),Java -> A.so -> B.so
1、java代码
package com.abc.util;
public class AuthCheck {
static {
System.loadLibrary("socall");
}
public native static long valid();
public static void main(String[] args) {
AuthCheck test = new AuthCheck();
System.out.println(test.valid());
}
}
2、编译java代码
进入到com/abc/util下javac AuthCheck.java
3、生成.h文件
返回到com的上一级目录javah -jni -classpath /home/xiao/JNITest com.abc.util.AuthCheck
会生成com_abc_util_AuthCheck.h
4、编写c文件socall.c
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
#include "com_abc_util_AuthCheck.h"
JNIEXPORT jlong JNICALL Java_com_abc_util_AuthCheck_valid(JNIEnv *env, jclass jc)
{
long (*myadd)();
void *handle;
handle=dlopen("./libnojni.so",RTLD_LAZY);//open lib file
if(!handle){
fprintf(stderr, "%s\n", dlerror());
exit(EXIT_FAILURE);
}
dlerror();
myadd=dlsym(handle,"Valid"); // libnojni.so中有函数long Valid()
long result=myadd();
dlclose(handle);
//printf("%d\n",result);
return result;
}
注意:如果libnojni.so是32位的,而你的Linux是64位的,那么以上代码运行会报错。需要统一为32或64
5、生成so文件
gcc -I/usr/java/jdk1.7.0_80/include/linux -I/usr/java/jdk1.7.0_80/include -fPIC -shared -o libsocall.so socall.c6、把两个so文件拷贝到jdk
cp /home/xiao/JNITest/libsocall.so libnojni.so /usr/java/jdk1.7.0_80/jre/lib/amd64/7、返回/home/xiao/JNITest下
java com.abc.util.AuthCheck
8、web应用调用so
web应用一般在web容器里,例如tomcat。此时再次调用,会出现异常: