android jni ndk dlopen

dlopen()

  功能:打开一个动态链接库

  包含头文件:

  #include<dlfcn.h>

  函数定义:

  void * dlopen( constchar *
pathname, intmode );

 

  函数描述:

  在dlopen的()函数以指定模式打开指定的动态连接库文件,并返回一个句柄给调用进程。使用dlclose()来卸载打开的库。

 

 mode是打开方式,其值有多个,不同操作系统上实现的功能有所不同,在linux下,按功能可分为三类:       

       1、解析方式

        RTLD_LAZY:在dlopen返回前,对于动态库中的未定义的符号不执行解析(只对函数引用有效,对于变量引用总是立即解析)。
       RTLD_NOW: 需要在dlopen返回前,解析出所有未定义符号,如果解析不出来,在dlopen会返回NULL,错误为::undefined symbol: xxxx.......

       2、作用范围,可与解析方式通过“|”组合使用。 
       RTLD_GLOBAL:动态库中定义的符号可被其后打开的其它库重定位。 
       RTLD_LOCAL:与RTLD_GLOBAL作用相反,动态库中定义的符号不能被其后打开的其它库重定位。如果没有指明是RTLD_GLOBAL还是RTLD_LOCAL,则缺省为RTLD_LOCAL。

       3、作用方式

       RTLD_NODELETE:在dlclose()期间不卸载库,并且在以后使用dlopen()重新加载库时不初始化库中的静态变量。这个flag不是POSIX-2001标准。 
       RTLD_NOLOAD:不加载库。可用于测试库是否已加载(dlopen()返回NULL说明未加载,否则说明已加载),也可用于改变已加载库的flag,如:先前加载库的flag为RTLD_LOCAL,用dlopen(RTLD_NOLOAD|RTLD_GLOBAL)后flag将变成RTLD_GLOBAL。这个flag不是POSIX-2001标准。
       RTLD_DEEPBIND:在搜索全局符号前先搜索库内的符号,避免同名符号的冲突。这个flag不是POSIX-2001标准。

 

  返回值:

  打开错误返回NULL

  成功,返回库引用

  编译时候要加入-ldl(指定dl库)

  例如

  gcc test.c -o test-ldl

 

时间: 2024-11-17 05:32:33

android jni ndk dlopen的相关文章

JNI编程基础(二)——Android Studio NDK开发

由于笔者目前的工作是Android开发,所以在JNI开发系列博客中穿插一篇AndroidStudio NDK开发介绍. 随着Android Studio 2.2的推出,Android Studio的NDK开发支持Cmake和ndk-build两种方式,简化了Android Studio上NDK开发流程,提升了开发效率.接下来就介绍下两种开发方式. 1. CMake CMake是一个跨平台的编译(安装)工具,支持通过用较为简单的语言来描述编译(安装)过程,最后输出适配不同平台的makefile货p

Android JNI 和 NDK

  1.Android NDK  一.NDK产生的背景 Android平台从诞生起,就已经支持C.C++开发.众所周知,Android的SDK基于Java实现,这意味着基于Android SDK进行开发的第三方应用都必须使用Java语言.但这并不等同于"第三方应用只能使用Java".在Android SDK首次发布时,Google就宣称其虚拟机Dalvik支持JNI编程方式,也就是第三方应用完全可以通过JNI调用自己的C动态库,即在Android平台上,"Java+C&quo

android 的NDK在Windwos环境搭建

NDK的Windwos环境搭建Eclipse版本是3.6以上的    一.下载android NDK您可以下载NDK r4  for Windows或NDK r5  for Windows安装包,下载地址:地址:http://developer.android.com/sdk/ndk/index.html   下载后解压缩到你的工作目录,例如:E:\Android\tools\android-ndk-r7,结果如下图:   Android NDK包含build.docs.samples.sour

AS2.2使用CMake方式进行JNI/NDK开发

之前写过一篇比较水的文章Android手机控制电脑撸出HelloWorld 里面用到了JNI/NDK技术. 这篇文章给大家介绍下JNI/NDK开发.采用的是Android Studio2.2开发环境,使用CMake方式进行开发. JNI(Java Native Interface)是java与C/C++进行通信的一种技术,使用JNI技术,可以java调用C/C++的函数对象等等,Android中的Framework层与Native层就是采用的JNI技术. 我们知道,Android系统是基于lin

android ndk-Android NDK编译已有的C++实现的协议库文件--求助

问题描述 Android NDK编译已有的C++实现的协议库文件--求助 RT,,Android.mk已经写好,NDK也已经配置好.自己写的代码可以用JNI 调用本地方法,但是调用一个用C/C++ 实现的协议库的时候却没有NDK的编译信息,当然也没有产生预期的.so文件.有没有遇到同样问题的大神呢?求助 >>>>> 解决方案 android c++ ndk 的编译环境搭建 解决方案二: http://blog.csdn.net/yangchang999/article/det

Android JNI局部引用表溢出:local reference table overflow (max=512)

转载请注明出处:http://blog.csdn.net/xyang81/article/details/44873769 在<JNI/NDK开发指南(十)--JNI局部引用.全局引用和弱全局引用>这篇文章中详细介绍了在JNI中三种引用的使用方式,区别.应用场景和开发注意事项.由于都是理论,看完之后可能印象不够深刻,由其是在开发当中容易出错的地方.所以这篇文章用一个例子说明引用使用不当会造成的问题,以引起大家对这个知识点的重视. 首先创建一个Android工程,在主界面放一个文本框和一个按钮,

android JNI调用机制

JNI的出现使得开发者既可以利用Java语言跨平台.类库丰 富.开发便捷等特点,又可以利用Native语言的高效. JNI是JVM实现中的一部分,因此Native语言和Java代码都运行在JVM的宿主环境. JNI是一个双向的接口:开发者不仅可以通过JNI在Java代码中访问Native模块,还可以在 Native代码中嵌入一个JVM,并通过JNI访问运行于其中的Java模块.可见,JNI担任了一个桥梁的角色,它将JVM与Native模块联系起 来,从而实现了Java代码与Native代码的互访

JNI/NDK开发指南(开山篇)

      转载请注明出处:http://blog.csdn.net/xyang81/article/details/41759643        相信很多做过Java或Android开发的朋友经常会接触到JNI方面的技术,由其做过Android的朋友,为了应用的安全性,会将一些复杂的逻辑和算法通过本地代码(C或C++)来实现,然后打包成so动态库文件,并提供Java接口供应用层调用,这么做的目的主要就是为了提供应用的安全性,防止被反编译后被不法分子分析应用的逻辑.当然打包成so也不能说完全安

android ndk-Android NDK 编译64位so

问题描述 Android NDK 编译64位so RT 请问如何编译64位的so文件呢?请详细点,菜鸟并不懂,谢谢 解决方案 APP_ABI := arm64-v8a http://developer.android.com/ndk/guides/ndk-build.html