当前位置:首页 » 操作系统 » linux动态库调用

linux动态库调用

发布时间: 2023-02-04 09:37:03

1. 请教关于android linux动态库.so的加载调用

有这两种办法:
第一种:
需求:
有时候应用修复了native层一个小BUG,应用需要更新了,但是用户必须下载整个APK包进行安装,而我们需要的只是替换SO
于是想,能不能加载自定义路径下的 SO 文件呢
答案是完全没问题:
使用系统方法:
void java.lang.System.load(String pathName)
但是有一点,pathName 路径必须有执行权限,意思就是说我们不能加载SD卡上的SO,因为没有执行权限
那也没关系,我们复制到应用私有目录下就OK嘛。
看码
private void load() {
File dir = getDir("libs", Context.MODE_PRIVATE);
File soFile = new File(dir, "libTestJNI.so");
FileUtils.assetToFile(this, "libTestJNI.so", soFile);

try {
System.load(soFile.getAbsolutePath());
} catch (Exception e) {
}
}
这样就完全OK,
我们只需要架个服务器,每次启动时动态监测 SO 文件有没有更新,有则下载SO,然后加载,这样就可以避免用户安装新的应用,
要知道重新安装应用的用户体验是很差的,要让用户无感知的更新他。
第二种:
采用dlopen动态加载第三方库,无非和system.load一样,就是要实现指定路径加载so的目的,这种方法升级so的话,那就的需要一个基本so,一直不变,用来调用dlopen,然后升级另一个so。
这两种办法都会遇到一个问题,就是不能直接加载SD卡中的so,因为sd卡没有执行权限,不能直接加载这种二进制文件,需要拷贝到data/data/packagename/files/ 目录下,再次进行加载即可,拷贝也是有讲究的,需要用到context.openFileOutput方法。

2. linux调用动态库弹出界面

您想问的是动态库的显式调用吧。
首先打开一个新库,并把它装入内存。
dlopen在dlfcn.h中定义,并在dl库中实现。
当库被装入后,可以把dlopen返回的句柄作为给dlsym的第一个参数,以获得符号在库中的地址。

3. linux对动态库函数的调用太慢

动态库函数在加载程序时,数据库将被加载。但是,动态加载程序链接器将符号解析推迟到函数调用时间。在对共享库的调用是通过过程链接表(PLT)中的一个条目间接完成的。最初,PLT中的所有条目都指向ld.so。在第一次调用函数时,ld.so查找符号的实际地址,更新PLT中的条目,并跳转到函数。这是“懒惰”符号解析。您可以设置LD_BIND_NOW环境变量来更改此行为。除此之外,试一下不用DLL直接把函数卸载程序里的运行速度,如果仍然慢,那就是算法的问题。

4. linuxopencv生成的静态或动态库怎样在调用的时候不用安装openvcv环境

使用cmake编译opencv静态链接库(静态库),配置环境变量(动态库和静态库一样),复制dll文件。
将这三个dll分别复制到C:WindowsSystem32和C:WindowsSysWOW64目录下。
配置包含目录:视图->其它窗口->属性管理器。配置库目录然后配置附加依赖项。

5. 请教关于android linux动态库.so的加载调用

1、 .so动态库的生成
可使用gcc或者g++编译器生成动态库文件(此处以g++编译器为例)
g++ -shared -fPIC -c XXX.cpp
g++ -shared -fPIC -o XXX.so XXX.o
2、 .so动态库的动态调用接口函数说明
动态库的调用关系可以在需要调用动态库的程序编译时,通过g++的-L和-l命令来指定。例如:程序test启动时需要加载目录/root/src/lib中的libtest_so1.so动态库,编译命令可照如下编写执行:
g++ -g -o test test.cpp –L/root/src/lib –ltest_so1
(此处,我们重点讲解动态库的动态调用的方法,关于静态的通过g++编译命令调用的方式不作详细讲解,具体相关内容可上网查询)

Linux下,提供专门的一组API用于完成打开动态库,查找符号,处理出错,关闭动态库等功能。
下面对这些接口函数逐一介绍(调用这些接口时,需引用头文件#include <dlfcn.h>):
1) dlopen
函数原型:void *dlopen(const char *libname,int flag);
功能描述:dlopen必须在dlerror,dlsym和dlclose之前调用,表示要将库装载到内存,准备使用。如果要装载的库依赖于其它库,必须首先装载依赖库。如果dlopen操作失败,返回NULL值;如果库已经被装载过,则dlopen会返回同样的句柄。
参数中的libname一般是库的全路径,这样dlopen会直接装载该文件;如果只是指定了库名称,在dlopen会按照下面的机制去搜寻:
a.根据环境变量LD_LIBRARY_PATH查找
b.根据/etc/ld.so.cache查找
c.查找依次在/lib和/usr/lib目录查找。
flag参数表示处理未定义函数的方式,可以使用RTLD_LAZY或RTLD_NOW。RTLD_LAZY表示暂时不去处理未定义函数,先把库装载到内存,等用到没定义的函数再说;RTLD_NOW表示马上检查是否存在未定义的函数,若存在,则dlopen以失败告终。
2) dlerror
函数原型:char *dlerror(void);
功能描述:dlerror可以获得最近一次dlopen,dlsym或dlclose操作的错误信息,返回NULL表示无错误。dlerror在返回错误信息的同时,也会清除错误信息。
3) dlsym
函数原型:void *dlsym(void *handle,const char *symbol);
功能描述:在dlopen之后,库被装载到内存。dlsym可以获得指定函数(symbol)在内存中的位置(指针)。如果找不到指定函数,则dlsym会返回NULL值。但判断函数是否存在最好的方法是使用dlerror函数,
4) dlclose
函数原型:int dlclose(void *);
功能描述:将已经装载的库句柄减一,如果句柄减至零,则该库会被卸载。如果存在析构函数,则在dlclose之后,析构函数会被调用。
3、 普通函数的调用
此处以源码实例说明。各源码文件关系如下:
test_so1.h和test_so1.cpp生成test_so1.so动态库。
test_so2.h和test_so2.cpp生成test_so2.so动态库。
test_dl.cpp生成test_dl可执行程序,test_dl通过dlopen系列等API函数,并使用函数指针以到达动态调用不同so库中test函数的目的。

6. 如何判断linux 动态库调用

创建静态库:
ar -rcs test.a *.o
查看静态库:
ar -tv test.a
解压静态库:
ar -x test.a

查看程序依赖的动态库:
readelf -a xxx|grep library
如:可以看到,下面的交叉程序hello执行依赖于如下两个动态库。
rebi@ubuntu:~/test$ arm-none-linux-gnueabi-readelf -a hello|grep "library"
0x00000001 (NEEDED) Shared library: [libgcc_s.so.1]
0x00000001 (NEEDED) Shared library: [libc.so.6]
rebi@ubuntu:~/test$

或者:readelf -l hello 即可。

nm xxx 查看符号
其中,T表示代码段,U表示在其它地方定义,所以需要确保必须在某个.o或库里被定义过。

7. linux c++动态库 调用 c动态库函数

先把.cpp编译成动态库,编译方法:
g++ *.cpp –fPIC –shared –o libtest.so -libyourclib.so
其中,*.cpp表示你的.cpp文件,你可以把它们一一列出,
–fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的,所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。
–shared:指明编译成动态库。
libtest.so即为生成的动态库,以lib开头,方便后面使用
-libyourclib.so 是你的c动态库名

编译好之后,就可以来编译你的测试程序了:
gcc test.c -o test -ltest
其中,test是生成的可执行程序
-ltest表示引用生成的动态库libtest.so
大概过程就是这样,你先试一试

8. linux c编程调用系统的动态库时,要使用dlopen等函数吗

linux调用库的方式有三种:
1.静态链接库
2.动态链接库
3.动态加载库
其中1,2都是在编程时直接调用,在链接时加参数-l进行链接
第三种需要在编程时使用dlopen等函数来获取库里面函数的定义,然后进行调用.
不过对于没有提供头文件的动态库,只能dlopen等函数来调用

9. 如何让自己的动态链接库文件能够在linux下被调用

如何让自己的动态链接库文件能够在linux下被调用

VxWorks
安装的DVD有很多自己的动态链接库文件,在启动一些服务的时候需要调用这些动态链接库文件,否则不能启动一些功能,report:找不到相关的库文件。

解决的方法可以有多种:

1.
直接创建软连接的方式,将某动态链接库文件链接到
/lib
或者/usr/lib
下。

ln
-s
`pwd`/xxx.so
/lib/xxx.so

这种方式适合少数固定不变动态链接库文件的调用,但如果文件很多,或者这些文件也是经常存在更新的,这么多比较繁琐。


2.
如果直接把动态链接库文件所在的路径直接加到系统查找库的路径下,这里有两种方式:

1)
更改/etc/ld.so.conf,
加入自己的动态链接库路径,好像需要更新/etc/ld.so.cache;
该方法应该可用,没有尝试过。

2)
更改环境变量LD_LIBRARY_PATH,把自己的动态链接库路径,加入到该环境变量中。
export
LD_LIBRARY_PATH=/Jenkins/workspace/Mefa_Nightly_regression_Job02/MAIN/mefa_platform/logs_1st_round/mefaImage/simulatorTools:$LD_LIBRARY_PATH
在该环境变量中的动态链接库文件会比系统中/lib
或者
/usr/lib
更早调用。

linux重启之后,该环境变量会失效;
这种方式更适合自动化的测试的需要。

热点内容
智能手环如何配置 发布:2024-05-16 13:48:00 浏览:483
shell脚本vim 发布:2024-05-16 13:43:15 浏览:301
征途修改脚本 发布:2024-05-16 13:42:31 浏览:408
xp共享打印机拒绝访问 发布:2024-05-16 13:41:31 浏览:813
常州php招聘 发布:2024-05-16 13:14:52 浏览:589
十二万左右捷达车配置质量怎么样 发布:2024-05-16 12:17:00 浏览:598
药品销售数据库 发布:2024-05-16 12:06:00 浏览:762
自动清理缓存的图片 发布:2024-05-16 11:50:13 浏览:814
怎么设置开机密码win8 发布:2024-05-16 11:49:59 浏览:827
ssh访问服务器文件 发布:2024-05-16 11:16:11 浏览:522