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()相关操作的更多相关文章

  1. NDK jni 加载静态库

    加载静态库到android,静态库的提供方式有2种, a. 通过源文件来编译静态库 b. 加载已经编译好的静态库 首先我们来看,通过源文件来编译静态库,工程目录如下 第一步:我们来看我们的jni目录, ...

  2. JNI加载Native Library 以及 跨线程和Qt通信

    Part1 Java Native Interface-JNI-JAVA本地调用 JNI标准是Java平台的一部分, 允许Java代码和其他语言进行交互; 开始实现-> Step 1) 编写Ja ...

  3. android java层通过jni加载使用第三方的so库

    1.例如我们自己编译一个so库,我们的其他模块要加载如何操作了 首先在c盘新建立一个文件夹sb,在sb下面新建立一个文件夹jni,如果你要使用ndk编译so库,必须需要有jni目录 2.在jni目录下 ...

  4. 在前端页面对easyui中的datagrid与jqgrid加载后的数据进行操作

    因为项目的需求,需要在grid中加载数据后再在前端页面执行操作,所以在easyui中的grid与jqgrid都进行了测试和操作: eayui中grid数据的操作: //构造集合对象 var list ...

  5. 前端笔记之jQuery(上)加载函数的区别&对象&操作HTML/CSS&动画&选择器

    一.jQuery简介 1.0 JavaScript编程比较恶心的地方 恶心1:选择元素麻烦,全线兼容的方法只有getElementById()和getElementsByTagName()两个.其他的 ...

  6. 判断iframe加载完成、用于当ifame加载完成时执行一些操作

    window.frames["iframec"].addEventListener( "load", function(){ window.frames[&qu ...

  7. spring boot容器加载完后执行特定操作

    有时候我们需要在spring boot容器启动并加载完后,开一些线程或者一些程序来干某些事情.这时候我们需要配置ContextRefreshedEvent事件来实现我们要做的事情 1.Applicat ...

  8. so加载报错:dlopen failed: couldn't map ... Permission denied

    转自:https://blog.csdn.net/u013270444/article/details/60869376 问题描述: 我的应用当中集成了一个安全相关的sdk,而这个sdk中使用的so是 ...

  9. as3 对于加载进来多层swf缩放操作

    //swf实际尺寸 var oldWidth:Number = frameLder.contentLoaderInfo.content.width; var oldHeight:Number = fr ...

随机推荐

  1. 关于react的分页

    基于antdesign分页:表格属性pagination <Table pagination={{ total: this.state.totalNum, showSizeChanger: tr ...

  2. python的列表生成式

    列表生成式 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 举个例子,要生成list [1, 2, 3, 4, 5, 6, 7, ...

  3. Problem B: STL——集合运算

    Description 集合的运算就是用给定的集合去指定新的集合.设A和B是集合,则它们的并差交补集分别定义如下: A∪B={x|x∈A∨x∈B} A∩B={x|x∈A∧x∈B} A-B={x|x∈A ...

  4. POST 调用 301 Moved Permanently 问题

    如上测试了2种,第一个post访问接口https能正常返回,第二个post访问接口http时301 Moved Permanently出现永久重定向问题,经检查发现服务器nginx对80端口做了重定向 ...

  5. 无线局域网(WLAN)

    无线局域网根据结构可以分为两大类:有固定基础设施的无线局域网和无固定基础设施的局域网. 有固定基础设施是指网络中已经预先存在了一批固定的数据处理和转发设备,这些固定设备可以通过有线方式连接其他网络或 ...

  6. python编程从入门到实践 alien invasion 项目源码

    现在上传一个 python编程从入门到实践 alien invasion 项目源码 以供大家学习参考 跟官方版本可能不太一样,因为是自己写的 也算是给新手一个参考 我用的环境是pycharm 可能需要 ...

  7. ListView嵌套ScrollView会出现的问题

    1.出现的问题:ListView高度显示不对,滑动冲突 (1)解决方法:如果说listview的数据一屏就可以显示完整,那么只需要在xml或者代码里给listview设置固定高度即可. 如果listv ...

  8. Invoker-n颜色涂m个珠子的项链

    参考https://blog.csdn.net/anxdada/article/details/76862564. https://blog.csdn.net/baidu_35643793/artic ...

  9. 1--Test NG--常见测试和注解

    第一:注解 (1)@test (2)@BeforeMethod,@AfterMethod (3)@BeforeClass,@AfterClass (4)@BeforeSuite,@AfterSuite ...

  10. CAShapeLayer绘图

    之前讲过使用UIBezierPath在UIView的drawRect中绘图, 今天我们讲下另外一种方式: CAShaperLayer 先说说使用CAShapeLayer的优点: GPU执行, GPU执 ...