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文件
#include <stdio.h>
#include "test.h" extern "C" void Test01()
{
printf("TestA func\n");
}
方法的前面以 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);
}
public static void main(String[] args) {
String cou = CLibrary.INSTANCE.Test01("hi",);
System.out.println(cou);
}
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()方法)
void Test01(String str, int num,Pointer p);
}
public static void main(String[] args) {
Pointer p = new Memory();
CLibrary.INSTANCE.Test01("hi", , p);
for(int i=, sumi=; i< sumi; i++){
System.out.print((char) p.getByteArray(, )[i]);
}
}
so链接库方法声明方式:
extern "C" void Test01(char* str, unsigned int num, char* strReturn){
*******************************
*****************
**********
return *****;
}
获取更多资源请访问:http://www.itcsdr.com/ 或者请扫描右上角关注公众号:IT资源分享平台
Java调用动态链接库so文件(传参以及处理返回值问题)的更多相关文章
- C# 多线程编程,传参,接受返回值
C# 多线程编程,传参,接受返回值 今天将多线程的知识有回顾了下,总结了几点: 新建一个线程(无参数,无返回值) Thread th = new Thread(new ThreadStart(Prin ...
- HttpClient调用doGet、doPost、JSON传参及获得返回值
调用 doPost:map传参 Map<String,Object> map = new HashMap<>(); map.put("test"," ...
- C#打开php链接传参然后接收返回值
php代码 一.php <?php header("Content-Type:text/html;charset=UTF-8"); $u=$_POST['zdupdate'] ...
- Java 调用 groovy 脚本文件,groovy 访问 MongoDB
groovy 访问 MongoDB 示例: shell.groovy package db import com.gmongo.GMongoClient import com.mongodb.Basi ...
- Java调用第三方dll文件的使用方法 System.load()或System.loadLibrary()
Java调用第三方dll文件的使用方法 public class OtherAdapter { static { //System.loadLibrary("Connector") ...
- java调用dll/so文件
大家都知道用C++编写的程序如果用于windows使用则编译为xxx.dll文件,如果是Linux使用则编译为libxxx.so文件.下面将java调用dll/so文件的方法粘出来方便下次使用.此处使 ...
- Java加载jar文件并调用jar文件当中有参数和返回值的方法
在工作当中经常遇到反编译后的jar文件,并要传入参数了解其中的某些方法的输出,想到Java里面的反射可以实现加载jar文件并调用其中的方法来达到自己的目的.就写了个Demo代码. 以下的类可以编译生成 ...
- java调用py文件传参执行
java执行的也是py文件主函数. 传参: String url="*********************"; String[] args1 = new String[] { ...
- Java自学-类和对象 传参
Java中的传参 变量有两种类型 基本类型 和类类型 参数也是变量,所以传参分为 基本类型传参 类类型传参 步骤 1 : 基本类型传参 基本类型传参 在方法内,无法修改方法外的基本类型参数 publi ...
随机推荐
- runloop是一个系统架构、是一个系统
信号与系统的系统: 事件源.派发系统.事件传播链.事件处理函数: 等组成的整体: 强调的重点是联系与结合.
- Pandas模块 -- 实操练习
如果对序列进行数学函数的运算,首选numpy模块: 如果对序列做统计运算,首选序列的“方法”,因为序列的“方法”更加丰富,如计算序列的偏度.峰度等,而Numpy模块是没有这样的函数. 手工构造数据框D ...
- 什么是JSON Web Token
JSON Web Token(JWT)是一个基于 RFC 7519 的开放数据标准,它定义了一种宽松且紧凑的数据组合方式,使用 JSON 对象在各应用之间传输加密信息.该 JSON 对象可以通过数字 ...
- 【JZOJ5551】【20190625】旅途
题目 \(n\)个点\(m\)条边的无向图,一条路径的代价定义为路径上前\(k\)大边的边权和 对于$k = n \to 1 $,求1-n的最短路 \(n,m \le 3000 \ , \ w_i \ ...
- Xshell远程登录
1.xshell由一台服务器a登录另一台服务器b sftp -oPort = root@ip 2.下载git /上传pull git b服务器想下载的目标文件目录 a服务器上的文件下载目录
- 第08组 Alpha冲刺(1/4)
队名 八组评分了吗 组长博客 小李的博客 作业博客 作业链接 组员1(组长) 过去两天完成了哪些任务 文字/口头描述 11月9号开小会安排alpha冲刺开始的工作,进行任务分工,具体见11.09会议记 ...
- js - true和false
JavaScript的true和false什么时候会出现,如何优雅的写判断条件? 以下条件为false,也可称为“falsy” - > 虚值 if (false) if (null) if (u ...
- 基于vue和echarts的数据可视化实现
基于vue和echarts的数据可视化: https://github.com/MengFangui/awesome-vue.git
- 织梦Dedecms后台登陆密码忘记怎么办?
有时候长期不登陆后台或则初次建站的新手常常忘记后台登陆密码,不过不用着急,早就有人写好了密码重设工具. 下载解压为radminpass.php, 通过FTP传到网站根目录,然后访问 http:// ...
- sql为什么要用where 1=1?
这个1=1常用于应用程序根据用户选择项的不同拼凑where条件时用的.例如:查询用户的信息,where默认为1=1,这样用户即使不选择任何条件,sql查询也不会出错.如果用户选择了姓名,那么where ...