`
zhanglibin1986
  • 浏览: 381651 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

给Android增加分享库.so文件

阅读更多
Android工程文件夹中,我们可以通过jni机制来调用c/c++编写的本地共享库,例如libtest.so

在java文件中声明一个静态的调用,和共享库中要调用的函数

test.java中

static{

system.loadlibrary("test");

}

static native int test(int i);

相应在相关的c/c++ 文件中按照jni的编写规则编写即可,Android自己增加了一个当loadlibrary时会调用jni_onload , jni_unload函数,这个不是重点。

我要提供的是so文件交叉编译的方法。

Android提供了ndk及相关mk文件的写法用来给编程人员编写c/c++本地文件,但我看了一下并不习惯这种编译方式,懒得去弄明白。所以决定还是按照原来的交叉编译方式进行

1.首先在源码中寻找/prebuild/linux-x86/tooltrain/arm-eabi-4.x.1/bin/这个目录下的编译文件,在~/.bashrc中将编译使用的gcc, g++, ar等定义相应变量cc,cpp,ar为arm编译器,并在make file中使用相应变量来编译

2.在编译so时要加上 -nostdlib 参数,不然系统会去链接标准库发生ld的错误

例如: $CPP -shared -nostdlib -fpic -o libtest.so -c test.o (test.c 生产test.o文件时需要-I 源码中的dalvik/libnativehelper/include/nativehelper文件夹,不然会因缺少头文件导致编译失败)

3.将生产的so文件拷贝到工程 /libs/armeabi/ 下,调用即可

解释几个基本概念:

1. 在linux中用ar -cvr -o libabcd.a ab.o cd.o 编译会生成.a文件,这个称为静态库或归档库,可以在编译的时候加入.a一起编译,(gcc -o main main.o -L. -labcd)运行时程序会copy静态库中的代码段。-L后面跟静态库所属目录,-l后为静态库名称,系统会自动过滤掉lib 和.a

2. .so文件生成 gcc -shared -fpic -o libabcd.so libabcd.a

so文件为共享库,相当于dll,在运行时要调用时才去加载共享库中代码 可执行文件编译方式与.a类似。

3.为什么要加入nostdlib,因为Android没有用linux的libc库,而是使用自己的c函数库
分享到:
评论

相关推荐

    ijkplayer 最新Android全架构so库 支持https,udp,rtp所有协议 支持rvmb,avi所有格式

    找了很久,积分花了不少,没一个好用的,要么是标题党,要么架构不全,...现在分享出来让那些坑积分的去shi吧.支持https,udp,rtp,支持所有音视频格式,包含完整齐全的架构:arm64-v8a、armeabi、armeabi-v7a、x86、x86_64

    安卓开发-微信分享Demo.zip.zip

    通常,SDK包含了一个jar包(如:wechat-sdk-android-without-mta-x.x.x.jar)和一个lib目录,lib目录中的so文件是针对不同CPU架构的库。将jar包添加到项目的构建路径,并确保将对应CPU架构的.so文件复制到项目的jni...

    Androidapk反编译之androidAPK有效加密方法.pdf

    DEX、RES、SO 库等文件是 Android APK 的主要文件,对这些文件进行加密可以有效防止 APK 被破解和反编译。通过爱加密 APK 源代码安全保护平台,对 Android APK 进行安全保护,最后下载 APK 包再次完成签名,就可以...

    Cordova 实现第三方登录及其分享.docx

    分享功能则是指用户能够将应用内的内容或链接分享至第三方平台,以此来增加应用的曝光度和传播性。 #### 使用Cordova实现第三方登录与分享的优势 Cordova是一种允许开发者使用HTML、CSS和JavaScript编写跨平台移动...

    GifImageView控件既可以显示网络下载的图片,也可以显示gif图片而且是网络下载的,挺好的东西,不是我写的,分享下赚点分

    但是,需要注意的是,由于GIF文件通常较大,过度使用可能会增加应用的内存消耗和启动时间,因此在使用时要适度并考虑优化。 总之,`GifImageView`是Android开发中的一个实用工具,通过它我们可以轻松地在应用中集成...

    system替换文件

    2. **替换lib文件**:压缩包中的`lib`目录可能包含更新或优化过的动态链接库(.so文件)或者其他的库文件。这些库文件对于某些特定功能的实现或性能提升至关重要。例如,更新GPU驱动库可以改善图形处理性能,优化编...

    通过百度API获取经纬度

    在提供的文件列表中,“libBMapApiEngine_v1_3_3.so”是一个动态链接库文件,通常用于Android平台。这个库文件包含了百度地图SDK的一部分功能,可能包含了获取经纬度的底层实现。在Android应用开发中,通过添加这个...

    Android 混淆代码详解及实例

    混淆过程中还需要考虑第三方服务和库,如Umeng分享统计。为避免混淆导致的问题,可以使用`-dontwarn`指令忽略警告,以及`-keep`指令保留特定方法,如: ``` -dontwarn android.support.v4.** -dontwarn org.apache....

    夸克_2.0.3.zip

    APK文件通常包含应用程序的代码、资源文件(如图片、音频、布局XML等)、库文件(如.so文件)以及应用的清单文件(AndroidManifest.xml)。 2. **夸克浏览器**:夸克浏览器是由阿里巴巴旗下的UC优视公司开发的一款...

    APK加固分享.pdf

    APK加固是一种为Android应用程序提供额外安全层的技术,其目的在于通过各种手段保护应用免受未经授权的逆向、篡改、重打包以及信息泄露等威胁。APK加固方案通常包括资源保护、代码混淆、签名保护、安全存储等多个...

    20170727分享主题“手机安全相关”整理1

    - **禁止调试**:在Android平台上,对.so文件进行调试禁止,可以防止恶意攻击者通过调试接口获取敏感信息。 - **公钥加密**:在网络请求时,解密后的密码会被立即用专门的公钥加密,确保在网络传输过程中密码的...

    可用的C++编写的aes算法

    8. **NDK编译为SO库**:NDK(Native Development Kit)是Android开发工具,允许开发者用C++编写原生代码,并将其编译为.so动态链接库,供Android应用程序调用。这样可以利用C++的性能优势,并且减少内存消耗。 9. *...

    安卓应用-电子图书-言读手机版 v1.0.zip

    此外,可能还有应用的资源文件(如图片、字体、音频等)、配置文件(如XML)、库文件(如.dex或.so)、以及可能的文档和帮助文件,用于介绍如何使用该应用。 在这个应用中,我们可以推测出以下知识点: 1. **安卓...

    cocos2d-x二维码控件

    2. 将编译后的库文件(如.a或.so)添加到项目的库路径中。 3. 配置项目的构建系统(如CMake或Xcode),确保链接到libqrencode库。 接下来,创建二维码控件的核心是使用DrawNode来绘制显示区。DrawNode是Cocos2d-x中...

    白彦庚:火眼自动化分析APK

    在实际操作过程中,白彦庚分享了一些遇到的问题,包括smalihook技术的局限性、利用so动态库实现功能、利用反射机制调用功能以及通过so发送短信的挑战。这些问题的解决需要白彦庚和他的团队不断优化火眼系统的架构和...

    自定义二维码扫码

    在Android开发中,我们可以集成ZBar的SO文件(针对Android的本地库)来实现二维码的解析。将ZBar的库添加到项目中后,我们需要编写Java代码来调用其API,进行图像捕获、解码并处理扫描结果。 1. **图像捕获**:通常...

    易语言-火牛视频1.2.8ak算法开源

    在JNI层,`libwq_core.so`是一个动态链接库文件,它是Android系统中的本地库。在Android应用开发中,JNI允许Java代码直接调用C/C++原生代码,提升性能或者使用非Java语言编写的功能,如加密解密算法。在这个例子中,...

    XT311 / XT316-开源

    1. **系统库**:包含了运行Android系统所需的各种动态链接库文件(.so),它们支持应用程序和服务的正常运行。 2. **框架服务**:这是Android系统的骨架,包括了系统服务、权限管理、广播接收器等关键组件。 3. **...

Global site tag (gtag.js) - Google Analytics