1.如何简单修改Android的源译so文件
2.å
³äºAndroidå¼åä¸Java对äº.soåºçè°ç¨
3.FFmpeg生成Android so库
4.android dlopenååå¨åªä¸ªso
如何简单修改Android的so文件
如何简单修改Android的so文件?
答:简单修改Android的so文件的方法。1.使用IDA工具打开so文件,码编ida.exe打开的是位和x的so,ida.exe打开的是位的so文件;
2.双击打开IDA工具,选择Go,有其他弹窗都是选择默认的,然后选择so目录将文件打开,也是默认按钮,左侧这边是方法名,选择可疑的方法名,然后按F5,弹窗选择默认按钮,就可以看到代码了,其实是伪代码;
3.选中伪代码里的单词(有些是可以选择的),双击,就会打开新的界面,有对应的代码坐标了
4.使用Editor打开同一个so文件,找到对应的坐标,修改右边的字符串,对应的进制也会相应的改变,然后保存。
å ³äºAndroidå¼åä¸Java对äº.soåºçè°ç¨
å家并没æ欺éªä½ æè æ¯å«ç³ä½ çææï¼ç¡®å®æ¯åªæä¾ç»ä½ jarå 以å so åºå°±å¯ä»¥äºï¼åæ³æ¯è¿æ ·åçï¼
1.æ¯å¦æç°å¨å¨ç¨net.sqlcipher.database è¿ä¸ªå å¯åºï¼ç½ä¸è½æå¾å°çï¼ç¨äºæ°æ®åºå å¯ï¼ã é£ä¹æç°å¨å°±å¨é¡¹ç®ç¨å è½½è¿ä¸ªjarå ï¼å¨ä½ ç项ç®åå»å³é®-ãå±æ§-ãJava Build Path-ãLibraries-ãAdd Jarsï¼éæ©æä¾ç»ä½ çjarå ï¼æè¿éæ¯ sqlcipher.jarï¼ç¶åå¨Order and Exportå¾éä½ ååå è½½ç jarå ãï¼
2.æå¼ä½ çworkspaceç®å½ï¼å¨ä½ ç项ç®ç®å½ä¸å建ä¸ä¸ªæ件夹libsï¼å¦ææ件夹ä¸åå¨çè¯ï¼,源译ç¶åå°æä¾ç»ä½ çsoåºæ¾å ¥è¯¥ç®å½ï¼åºæ¬æ¶æå°±ç®æ¯æ建好äºã
3.è¿è¡å¼åï¼è¿éä½ éè¦é®ä¸ä¸æä¾ç»ä½ jarå çå家ï¼åºæ¬çç¨æ³ï¼å¦åçè¯æ¯æ æ³è¿è¡å¼åçï¼å ä¸ºä½ é½ä¸ç¥éæä¹å»ç¨ã sqlcipherçåºæ¬ç¨æ³æ¯ï¼
SQLiteDatabase.loadLibs(this); //å è½½ soåºæ件ï¼ä½ çå家çæ¹æ³åºè¯¥ä¹æ¯ç±»ä¼¼ã
File databaseFile = getDatabasePath(SQLite_toll.DATABASE_NAME);
databaseFile.mkdirs();
databaseFile.delete();
SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(databaseFile, helper_SharedPreferences.get_str_sp("database_cipher",this), null);
SQLite_toll initToll = new SQLite_toll(this, avaSys);
initToll.onCreate(database);
database.close();
//å 为æsqlcipheræ¯ç¨äºæ°æ®åºå å¯çï¼æä»¥ä½ æçå°çé½æ¯æ°æ®åºçä¸äºæ¹æ³ï¼ä½ å家æä¾ç»ä½ çjarå çç¨æ³ï¼ä½ æ¯è¦å»é®ä»ä»¬çï¼æè ä»ä»¬çæ¯å¦æå¼æºä»£ç ï¼åæè æ¯ç½ä¸ä¹æå¾å¤äººä½¿ç¨ï¼é£ä¹è½æå°ç¸å ³èµæã
æ ¹æ®ä½ è¡¥å çæé®ï¼é£ä¹å°±æ¯System.loadLibrary(this); ï¼å°±å¯ä»¥è°ç¨äº
FFmpeg生成Android so库
为了生成适用于Android的.so库,本文详细记录了从环境准备到成功编译的码编整个过程。以FFmpeg 4.2.2版本和NDK .1.为实例,源译朔源码造假解释了不同编译环境下的码编超级码源码操作细节,为开发者提供了一套可行的源译解决方案。以下是码编编译过程的概述: 编译环境:- FFmpeg版本:4.2.2
- 操作系统:Mac
- NDK版本:.1.
- 手机型号:QIOO
手机硬件架构:- 架构:arm
- CPU类型:armv8-a
- TOOL_CPU_NAME:aarch
编译工具链:- NDK工具链目录:/Users/xxx/Library/Android/sdk/ndk/.1./toolchains/llvm/prebuilt/darwin-x_/bin
- 单独的交叉编译环境目录:/Users/xxx/Library/Android/sdk/ndk/.1./toolchains/llvm/prebuilt/darwin-x_/sysroot
在编译过程中,使用CLANG代替了GCC,源译这是码编因为Google在NDK版本之后,全面推行使用CLANG。源译对于Mac操作系统,码编需确保正确安装NDK和FFmpeg,源译网页源码小偷通过adb命令查看手机硬件信息以确定架构和CPU类型,码编以确保编译出的源译.so库与手机兼容。 编译步骤概览如下:- **下载**:从ffmpeg.org和dl.google.com下载FFmpeg和NDK。
- **环境配置**:在Mac上,诗词门户源码确保正确设置NDK路径和输出文件路径,以便在指定目录下生成.so库。
- **脚本编写与执行**:使用自定义的shell脚本(如build_android_clang.sh)来执行编译过程,这一步骤中需要根据个人环境调整NDK和输出路径的丰源源码环境变量。
- **脚本调用**:运行编译脚本,生成适用于Android的.so库文件。
在Linux环境下,操作流程与Mac类似,但配置细节有所差异。例如,需要在/etc/profile中设置环境变量,使用不同的编译脚本来执行编译任务,并通过./android_build.sh命令启动编译过程。Linux环境下的编译通常速度较快,几分钟内即可完成编译生成.so库。 总结:通过遵循上述指导,开发者可以成功地在Mac或Linux操作系统中生成适用于Android的.so库,解决FFmpeg与最新版本NDK不兼容的问题。此过程对于集成FFmpeg库到Android应用中至关重要,确保了编译出的库与目标设备的硬件架构兼容,从而实现高效的音视频处理能力。android dlopenååå¨åªä¸ª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/liblibtest_so1.soæåºç¼è¯å½ä»¤ç §ç¼åæ§è¡ï¼
g++ -g -o test test.cpp âL/root/src/lib âltest_so1
ï¼å¤æéç¹è®²è§£æåºæè°ç¨å ³äºéæég++ç¼è¯å½ä»¤è°ç¨å¼ä½è¯¦ç»è®²è§£å ·ä½ç¸å ³å 容ç½æ¥è¯¢)
Linuxæä¾ä¸é¨ç»APIç¨äºå®ææåºæ¥æ¾ç¬¦å·å¤çéå ³éæåºçåè½
é¢äºæ¥å£å½æ°éä»ç»ï¼è°ç¨äºæ¥å£éå¼ç¨æ件#include )ï¼
1) dlopen
å½æ°ååï¼void *dlopen(const char *libname,int flag);
åè½æè¿°ï¼dlopenå¿ é¡»dlerrordlsymdlcloseåè°ç¨è¡¨ç¤ºè¦åºè£ è½½å ååå¤ä½¿ç¨è¦è£ è½½åºä¾èµäºå ¶åºå¿ é¡»é¦å è£ è½½ä¾èµåºdlopenæä½å¤±è´¥è¿NULLå¼ï¼åºå·²ç»è£ è½½ådlopenè¿åå¥æ
åæ°libnameè¬åºå ¨è·¯å¾dlopenç´æ¥è£ 载该æ件ï¼æå®åºå称dlopenæç §é¢æºå¶æ寻ï¼
a.æ ¹æ®ç¯å¢åéLD_LIBRARY_PATHæ¥æ¾
b.æ ¹æ®/etc/ld.so.cacheæ¥æ¾
c.æ¥æ¾ä¾/lib/usr/libç®å½æ¥æ¾
flagåæ°è¡¨ç¤ºå¤çæªå®ä¹å½æ°å¼ä½¿ç¨RTLD_LAZYæRTLD_NOWRTLD_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.htest_so1.cpptest_so1.soæåº
test_so2.htest_so2.cpptest_so2.soæåº
test_dl.cpptest_dlæ§è¡ç¨åºtest_dlédlopenç³»åçAPIå½æ°å¹¶ä½¿ç¨å½æ°æéè¾¾æè°ç¨åsoåºtestå½æ°ç®
-