JNI加载hal的dlopen()相关操作
1.函数集合
#include <dlfcn.h> void *dlopen(const char *filename, int flag);
char *dlerror(void);
void *dlsym(void *handle, const char *symbol);
int dlclose(void *handle);
Link with -ldl.
2.Demo例子
caculate.c用于编译成一个库
int add(int a,int b)
{
return (a + b);
} int sub(int a, int b)
{
return (a - b);
} int mul(int a, int b)
{
return (a * b);
} int div(int a, int b)
{
return (a / b);
}
main.c调用这个库里面的函数
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h> #define LIB_CACULATE_PATH "./libcaculate.so" typedef int (*CAC_FUNC)(int, int); int main()
{
void *handle;
char *error;
CAC_FUNC cac_func = NULL; handle = dlopen(LIB_CACULATE_PATH, RTLD_LAZY);
if (!handle) {
fprintf(stderr, "%s\n", dlerror());
return -;
} //获取一个函数
cac_func = dlsym(handle, "add");
if ((error = dlerror()) != NULL) {
fprintf(stderr, "%s\n", error);
return -;
}
printf("add: 2+7=%d\n", cac_func(,)); cac_func = dlsym(handle, "sub");
printf("sub: 9-2=%d\n", cac_func(,)); cac_func = dlsym(handle, "mul");
printf("mul: 3*2=%d\n", cac_func(,)); cac_func = dlsym(handle, "div");
printf("div: 8/2=%d\n", cac_func(,)); dlclose(handle); return ;
}
编译执行:
编译:
$ gcc -rdynamic -o main main.c -ldl
$ gcc -shared -fPIC caculate.c -o libcaculate.so
执行:
$ ./main
add: +=
sub: -=
mul: *=
div: /=
或者使用一个结构体将所有的函数包装起来,这样只需要调用一次dlsym()
struct math {
int (*add)(int a,int b);
int (*sub)(int a,int b);
int (*mul)(int a,int b);
int (*div)(int a,int b);
}; static int math_add(int a,int b)
{
return (a + b);
} static int math_sub(int a, int b)
{
return (a - b);
} static int math_mul(int a, int b)
{
return (a * b);
} static int math_div(int a, int b)
{
return (a / b);
} /*shouldn't be static, else dlsym() couldn't find it*/
struct math HMI = {
.add = math_add,
.sub = math_sub,
.mul = math_mul,
.div = math_div,
};
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h> struct math {
int (*add)(int a,int b);
int (*sub)(int a,int b);
int (*mul)(int a,int b);
int (*div)(int a,int b);
}; #define LIB_CACULATE_PATH "./libcaculate.so" typedef int (*CAC_FUNC)(int, int); int main()
{
void *handle;
char *error;
struct math *hmi; handle = dlopen(LIB_CACULATE_PATH, RTLD_LAZY);
if (!handle) {
fprintf(stderr, "%s\n", dlerror());
return -;
} //获取一个函数
hmi = dlsym(handle, "HMI");
if ((error = dlerror()) != NULL) {
fprintf(stderr, "%s\n", dlerror());
return -;
}
printf("add: 2+7=%d\n", hmi->add(,));
printf("sub: 9-2=%d\n", hmi->sub(,));
printf("mul: 3*2=%d\n", hmi->mul(,));
printf("div: 8/2=%d\n", hmi->div(,)); dlclose(handle); return ;
}
3.详细信息:# man dlopen
JNI加载hal的dlopen()相关操作的更多相关文章
- NDK jni 加载静态库
加载静态库到android,静态库的提供方式有2种, a. 通过源文件来编译静态库 b. 加载已经编译好的静态库 首先我们来看,通过源文件来编译静态库,工程目录如下 第一步:我们来看我们的jni目录, ...
- JNI加载Native Library 以及 跨线程和Qt通信
Part1 Java Native Interface-JNI-JAVA本地调用 JNI标准是Java平台的一部分, 允许Java代码和其他语言进行交互; 开始实现-> Step 1) 编写Ja ...
- android java层通过jni加载使用第三方的so库
1.例如我们自己编译一个so库,我们的其他模块要加载如何操作了 首先在c盘新建立一个文件夹sb,在sb下面新建立一个文件夹jni,如果你要使用ndk编译so库,必须需要有jni目录 2.在jni目录下 ...
- 在前端页面对easyui中的datagrid与jqgrid加载后的数据进行操作
因为项目的需求,需要在grid中加载数据后再在前端页面执行操作,所以在easyui中的grid与jqgrid都进行了测试和操作: eayui中grid数据的操作: //构造集合对象 var list ...
- 前端笔记之jQuery(上)加载函数的区别&对象&操作HTML/CSS&动画&选择器
一.jQuery简介 1.0 JavaScript编程比较恶心的地方 恶心1:选择元素麻烦,全线兼容的方法只有getElementById()和getElementsByTagName()两个.其他的 ...
- 判断iframe加载完成、用于当ifame加载完成时执行一些操作
window.frames["iframec"].addEventListener( "load", function(){ window.frames[&qu ...
- spring boot容器加载完后执行特定操作
有时候我们需要在spring boot容器启动并加载完后,开一些线程或者一些程序来干某些事情.这时候我们需要配置ContextRefreshedEvent事件来实现我们要做的事情 1.Applicat ...
- so加载报错:dlopen failed: couldn't map ... Permission denied
转自:https://blog.csdn.net/u013270444/article/details/60869376 问题描述: 我的应用当中集成了一个安全相关的sdk,而这个sdk中使用的so是 ...
- as3 对于加载进来多层swf缩放操作
//swf实际尺寸 var oldWidth:Number = frameLder.contentLoaderInfo.content.width; var oldHeight:Number = fr ...
随机推荐
- Js函数基本介绍
1. 函数的创建 在JavaScript里面创建函数的关键字为function 函数名:就是在我们调用函数的时候需要书写的标识符 形参:全称为形式参数,调用函数的时候,这个函数所需要的参数是什么 实参 ...
- Excel文件上传功能实现
$(function(){ let file; //上传点击事件 $('#btn').bind('click', function(){ let val = $('#fb').filebox('get ...
- Java容器解析系列(8) Comparable Comparator
Comparable和Comparator接口是两个用于对对象进行大小比较的接口,在java集合相关类中,也被经常地使用到. 关于其使用,可以参考网络上的其他博客(没什么好说的);这里阐述关于这两个接 ...
- python3读取sqlyog配置文件中的MySql密码
这个人有什么目的?: 我多多少少听过一些安全圈的大牛说到类似的思路,大意是可以通过扫描各种程序和服务的配置文件(比如SVN的文件,RSYNC的配置文件等), 从中发现敏感信息,从而找到入侵的突破口.沿 ...
- python之django基础
看了不是同一期的视频,发现9期老师线性引入的方式,讲得django更加易于理解掌握. 抱歉的是,笔记没有整理就发上来了.希望看到的人不要被我带偏. 1. 新建Django项目 命令行创建: djang ...
- 马凯军201771010116《面向对象与程序设计Java》第十周学习总结
一.理论知识学习部分 泛型类的约束与局限性: 不能用基本类型实例化类型参数 运行时类型查询只适用于原始类型 不能抛出也不能捕获泛型类实例 参数化类型的数组不合法 不能实例化类型变量 泛型类的 ...
- Python matplotlib绘图学习笔记
测试环境: Jupyter QtConsole 4.2.1Python 3.6.1 1. 基本画线: 以下得出红蓝绿三色的点 import numpy as npimport matplotlib. ...
- 【原创】Arduino、arm、树莓派与单片机
Arduino是一个由开源软件环境支持的开源硬件原型平台.包含硬件(各种型号Arduino板)和软件(Arduino IDE).集成开发环境是Arduino IDE ,编写和编译sketch后通过US ...
- Archlinux安装总结
Archlinux安装总结 一.引导 1.BIOS与UEFI root@archiso ~ # ls /sys/firmware/efi/efivars ls: cannot access '/sys ...
- Python_02
Python 判断语句 if,while if ture: print(1) else: print(0) for循环和内嵌函数range() range(a,b,c) a:起始位置 b:终止 ...