Java调⽤动态链接库so⽂件(传参以及处理返回值问题)
刚来到公司,屁股还没坐稳,⽼板把我叫到办公室,就让我做⼀个⼩程序。我瞬间懵逼了。对⼩程序⼀窍不通,还好通过学习⼩程序视频,两天的时间就做了⼀个云开发的⼩程序,但是领导不想核⼼的代码被别⼈看到,给了我⼀个dll⽂件。了⼤量的资料,还是⽤Java做吧,于是⼜快速的⽤Java搭建了⼀个后台,测试了⼀下,发现dll调⽤成功了,但是在发布到服务器上的时候,dll⽂件⼜不⾏了,⼜⽅法。发现so⽂件和dll⽂件⼀样,都是打包⽣成的动态链接库,于是就在服务器上测试调⽤so⽂件,在调⽤so⽂件的时候出现了很多的问题,例如so ⽂件⽣成失败、调⽤so⽂件不到⾥⾯的⽅法、返回值出现乱码等。
⼀、⽣成so⽂件(Limux下操作)
1.把.h⽂件和.cpp⽂件放到⼀起(随意了想咋放都⾏执⾏命令的时候地址写对就好)
test.h⽂件只写.cpp⽂件⾥⾯的⽅法名
void Test01();
test.cpp⽂件
#include <stdio.h>
#include "test.h"
void Test01()
{
printf("TestA func\n");
}
⽣成so⽂件的命令(在⽂件的路径下执⾏)
g++ test.cpp -fPIC -shared -o libtest.so
so⽂件以lib开头(lib**.so)
这种⽅式⽣成的so⽂件有时在Java后端调⽤的时候报不到指定⽅法的错误。然后了好久到⼀个⽅法给我解决了这个问题(看第⼆种⽣成so⽂件的⽅式)。(如果这个⽅法你们不适⽤,那就另解决⽅式吧)
2.不要.h⽂件了直接⽤.cpp⽂件
1 #include <stdio.h>
2 #include "test.h"
3
4extern"C"void Test01()
5 {
6 printf("TestA func\n");
7 }
⽅法的前⾯以 extern "C"开头,⽤这种⽅式对⽅法进⾏声明。
2.通过Java的jna包调⽤so⽂件进⾏传参(直接上代码)
public interface CLibrary extends Library {
// DLL⽂件默认路径为项⽬根⽬录,若DLL⽂件存放在项⽬外,请使⽤绝对路径。(此处:(Platform.isWindows()?"msvcrt":"c")指本地动态库msvcrt.dll)
CLibrary INSTANCE = (CLibrary) Native.loadLibrary(("/usr/lib/libtest.so"),
CLibrary.class);
// 声明将要调⽤的so中的⽅法,可以是多个⽅法(此处⽰例调⽤so动态库libtest.so中的Test01()⽅法)
void Test01(String str, int num);
}
1public static void main(String[] args) {
2 String cou = CLibrary.INSTANCE.Test01("hi",123);
3 System.out.println(cou);
4
5 }
3.⼜是调⽤so⽂件返回值是字符串的时候会出现乱码(解决⽅法如下)
通过⽤Pointer来获取返回值,⽽so链接库的返回值要存到指针⾥⾯
Java代码:
public interface CLibrary extends Library {
// DLL⽂件默认路径为项⽬根⽬录,若DLL⽂件存放在项⽬外,请使⽤绝对路径。(此处:(Platform.isWindows()?"msvcrt":"c")指本地动态库msvcrt.dll) CLibrary INSTANCE = (CLibrary) Native.loadLibrary(("/usr/lib/libtest.so"),
CLibrary.class);
// 声明将要调⽤的so中的⽅法,可以是多个⽅法(此处⽰例调⽤so动态库libtest.so中的Test01()⽅法)
java库void Test01(String str, int num,Pointer p);
}
public static void main(String[] args) {
Pointer p = new Memory(22);
CLibrary.INSTANCE.Test01("hi", 123, p);
for(int i=0, sumi=21; i< sumi; i++){
System.out.print((char) p.getByteArray(0, 21)[i]);
}
}
so链接库⽅法声明⽅式:
extern"C"void Test01(char* str, unsigned int num, char* strReturn){
*******************************
*****************
**********
return *****;
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论