You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Android NDK中使用已引入的依赖?SQLCipher集成疑问

在Android NDK/C++项目中使用SQLCipher的C接口

作为从iOS转Android的开发者,我太懂你这种刚换平台摸不着头绪的感觉了——毕竟两个平台的依赖管理和Native开发逻辑确实有不少差异。下面就给你一步步理清楚怎么在NDK/C++项目里用上SQLCipher的C头文件和预编译库:

一、找到SQLCipher依赖的安装位置

当你在build.gradle里添加implementation 'net.zetetic:android-database-sqlcipher:4.2.0@aar'后,Gradle会自动把这个AAR包下载到本地的Gradle缓存目录,路径一般是:

~/.gradle/caches/modules-2/files-2.1/net.zetetic/android-database-sqlcipher/4.2.0/[一串随机哈希值]/android-database-sqlcipher-4.2.0.aar

你可以把这个AAR文件解压,里面的jni目录下会有对应不同CPU架构(比如armeabi-v7aarm64-v8ax86等)的预编译库,同时还有一个include文件夹,里面就是你需要的SQLCipher C头文件(比如sqlite3.hsqlite3ext.h这些核心头文件)。

二、在NDK项目中配置使用SQLCipher

如果你用CMake构建Native代码:

  1. 配置头文件路径:在模块的build.gradle里,找到android.defaultConfig.externalNativeBuild.cmake,添加头文件搜索路径的参数:
    android {
        defaultConfig {
            externalNativeBuild {
                cmake {
                    arguments "-DANDROID_STL=c++_shared", 
                              "-DSQLCIPHER_INCLUDE_DIR=/path/to/your/unzipped/aar/include"
                }
            }
        }
    }
    
    或者直接在CMakeLists.txt里用include_directories指定路径:
    include_directories(/path/to/your/unzipped/aar/include)
    
  2. 链接SQLCipher库:在CMakeLists.txt中找到你的Native目标库,添加链接逻辑:
    # 找到SQLCipher的预编译库
    find_library(SQLCIPHER_LIB sqlcipher
                 PATHS /path/to/your/unzipped/aar/jni/[你的目标ABI])
    # 链接到你的Native库
    target_link_libraries(your-native-lib-name
                         ${SQLCIPHER_LIB}
                         android
                         log)
    

如果你用ndk-build构建Native代码:

  1. 配置头文件路径:在Android.mk中添加:
    LOCAL_C_INCLUDES += /path/to/your/unzipped/aar/include
    
  2. 链接SQLCipher库:同样在Android.mk中添加:
    LOCAL_LDLIBS += -L/path/to/your/unzipped/aar/jni/[你的目标ABI] -lsqlcipher
    

三、几个关键注意事项

  • ABI匹配:一定要确保你选择的目标ABI(比如arm64-v8a)和SQLCipher库的ABI目录对应,不然会出现架构不兼容的崩溃。
  • 密钥设置:和Java层用法一致,在打开数据库后要调用sqlite3_key()函数设置加密密钥,不然无法正常访问加密后的数据库。
  • OpenSSL依赖:不用担心,这个AAR包里已经包含了SQLCipher所需的OpenSSL依赖库,不需要你额外手动添加。

另外,如果你想要更灵活的控制,也可以直接把SQLCipher的C源码克隆下来集成到你的NDK项目中编译,但用AAR里的预编译库会更省心,适合快速上手。

内容的提问来源于stack exchange,提问作者David

火山引擎 最新活动