Java Web中调用.so Linux库

xiaoxiao2021-02-28  91

在Java Web项目中我们很少看到用到外部的共享库,周天在玩Android Studio的时候研究了一下,配合网上的教程,移植到了Java Web下,第一次写博客凑合看吧,以下仅供参考:

这是最终生成的文件目录结构,这个Java类是有package的,体现在文件系统中就是目录:

创建Java包的目录结构:

mkdir -p org/lyle

切换到org/lyle目录下,编辑TestJni.java

cd org/lyle && vi TestJni.java

package org.lyle; public class TestJni { static { System.load("/usr/TestJni/libTestJni.so"); // 项目加载时从目录直接加载资源到内存 // 本处没有使用loadLibrary(),如果使用需要配置LD_LIBRARY_PATH } private native String get(String s); public static void main(String[] args){ org.lyle.TestJni hj = new org.lyle.TestJni(); String c = hj.get("asdfadf"); System.out.println("come from java: " + c); } }

切换到项目根路径,编译Java文件,生成字节码.class文件

cd - && javac org/lyle/TestJni.java

在项目根路径,生成 .h C语言头文件

javah org.lyle.TestJni

编写C语言原文件,文件名要和 .h文件名一致

vi org_lyle_TestJni.c

#include "org_lyle_TestJni.h" JNIEXPORT jstring JNICALL Java_org_lyle_TestJni_get(JNIEnv *env, jobject jo, jstring js){ char * a = (char *)(*env)->GetStringUTFChars(env, js, NULL); printf("come from c: %s\r\n", a); return js; }

编译C语言源文件,生成 .o目标文件

gcc -fPIC -D_REENTRANT -I/opt/java7/include -I/opt/java7/include/linux -c org_lyle_TestJni.c /opt/java7/include 是jre的头文件的目录,目录中包含编译jni需要的jni.h文件 /opt/java7/include/linux 包含了编译在Linux下编译jni需要的jni_md.h文件

链接 .o 文件生成 .so 库文件, Liunx库文件通常要以lib**.so格式命名

gcc -shared org_lyle_TestJni.o -o libTestJni.so

运行 .class 文件,观察输出结果

java org/lyle/TestJni

全部文件百度云链接:http://pan.baidu.com/s/1mhD90xE

转载请注明原文地址: https://www.6miu.com/read-70279.html

最新回复(0)