之前已经试过用c调用.a库,也有总结在工作文档中,下面在家试试用java利用jni(jna应该更方便)调用.so库(其实很相似,不过之前是Linux,这里是win)
建立项目:
1.编写源文件:
package com.demo.TestLib.JniSo;
public class Hello{
static{
System.load("/lib/libHello.so");
}
public native void say();
public native String world(String str);
public static void main(String...args){
Hello hello = new Hello();
hello.say();
System.out.println("java : "+hello.world("hello"));
}
}
2.编译Hello.java - Hello.class
解决办法:将系统变量中的path路径,也复制到用户变量的Path路径中,(为什么呢?)
3.编译Hello.class 生成 com_jni_Hello.h 的头文件
资料中说:用
但是jdk9之后(大概)javah不可用了,应:
生产了一个头文件:
4.编写c++/c的业务代码,引用com_jni_Hello.h 的头文件,并实现定义的方法
#include "com_demo_TestLib_JniSo_Hello.h"
#include "string.h"
JNIEXPORT void JNICALL Java_com_demo_TestLib_JniSo_Hello_say(JNIEnv *env, jobject object){
printf("hello world!");
}
JNIEXPORT jstring JNICALL Java_com_demo_TestLib_JniSo_Hello_world(JNIEnv *env, jobject obejct, jstring string){
const char *wd = " world!!";
const char *getstr = (*env)->GetStringUTFChars(env,string, 0);
char *str;
str=strcpy(str,wd);
str=strcpy(str,getstr);
jstring out= (*env)->NewStringUTF(env,str);
return out;
}
以下待完成:
5.编译c/c++ 代码生成动态链接库 .so文件
gcc -fPIC -D_REENTRANT C:\java\jdk-13\include\win32 -c Hello.c
6:把so的路劲添加到LD_LIBRARY_PATH变量
export LD_LIBRARY_PATH=/home/admin/lib
7: 运行java程序
java com.jni.Hello
8:结果
java : hello
hello world!
————————————————
版权声明:本文为CSDN博主「ailice001」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ailice001/article/details/79880876
另:
1.so为linux下的产物,所以我用windows没有道理。。。。再讨论吧
so库文件使用
2.java调用dll倒是需要学习
java调用dll库
3.java利用jna调用.so库
添加链接描述