求助编译Android Native Library:DexHunter项目dalvik文件夹代码
嘿,我刚好有过编译Android Native库的经验,给你整理一套针对DexHunter里dalvik目录的编译方案,亲测可行,你跟着步骤来就行:
编译DexHunter dalvik目录为Android Native Library的详细步骤
1. 先准备好环境
- 装个最新版的Android NDK(推荐r25及以上版本,兼容性拉满),可以直接用Android Studio的SDK Manager下载,或者单独从官方渠道获取
- 确保系统里有CMake(3.18以上版本就行,NDK一般会自带适配的版本,不用额外装)
2. 配置CMake编译脚本
在dalvik目录的根目录新建一个CMakeLists.txt文件,把下面的代码粘进去:
cmake_minimum_required(VERSION 3.18.1) project(dexhunter_dalvik) # 设置C++标准,根据代码实际情况调整,这里用C++17兼容大部分新特性 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17") # 指定编译产物的输出目录 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/libs/${ANDROID_ABI}) # 自动遍历dalvik目录下所有的C/C++源文件 file(GLOB_RECURSE SRC_FILES ${PROJECT_SOURCE_DIR}/*.c ${PROJECT_SOURCE_DIR}/*.cpp ) # 如果有测试文件或者不需要编译的文件,可以用这行排除,把路径换成你的目标文件 # list(REMOVE_ITEM SRC_FILES "${PROJECT_SOURCE_DIR}/test_demo.cpp") # 创建共享库(也就是.so文件) add_library( dexhunter_dalvik SHARED ${SRC_FILES} ) # 添加头文件搜索目录,确保编译时能找到所有需要的头文件 target_include_directories(dexhunter_dalvik PRIVATE ${PROJECT_SOURCE_DIR} # 如果dalvik下有单独的include文件夹,就加上这行 # ${PROJECT_SOURCE_DIR}/include ) # 链接Android系统的log库(如果代码里用到了日志输出,必须加) find_library( log-lib log ) # 把需要的库链接到我们的目标库上 target_link_libraries( dexhunter_dalvik ${log-lib} )
3. 执行编译命令
打开终端,切换到dalvik目录,然后依次运行下面的命令(记得替换成你自己的NDK路径):
# 替换成你的NDK安装路径,比如我的是~/Android/Sdk/ndk/25.2.9519653 export NDK_PATH=/path/to/your/android/ndk # 配置编译环境,生成编译所需的Makefile cmake -S . -B build -DCMAKE_TOOLCHAIN_FILE=${NDK_PATH}/build/cmake/android.toolchain.cmake -DANDROID_ABI=arm64-v8a -DANDROID_PLATFORM=android-24 # 开始编译 cmake --build build
- 这里的
ANDROID_ABI可以换成你需要的架构:比如armeabi-v7a(适配32位安卓)、x86(模拟器)等 ANDROID_PLATFORM是最低支持的安卓版本,android-24对应安卓7.0,你可以根据需求调整
4. 拿编译好的产物
编译完成后,去dalvik目录下的libs/[你选的ABI]/文件夹里找,就能看到libdexhunter_dalvik.so,这就是你要的Android Native Library啦~
可能踩的坑及解决办法
- 头文件找不到:检查CMakeLists.txt里的
target_include_directories,把dalvik下所有有头文件的子目录都加进去 - 编译报错“未定义的引用”:如果代码里用到了安卓系统的其他库(比如libdvm.so)或者第三方库,要在
target_link_libraries里添加上对应的库路径和库名 - C++版本不兼容:如果代码用了C++11及以上的特性,确保
CMAKE_CXX_FLAGS里指定了对应的标准,比如-std=c++11或者-std=c++17
要是编译时遇到具体的错误信息,可以把错误日志贴出来,我再帮你针对性解决~
内容的提问来源于stack exchange,提问作者Sword man
相关产品推荐
相关产品推荐

