You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

KMM项目如何正确构建libSQLCipher.a并解决加密方法无法访问问题

无CocoaPods集成SQLCipher到KMM项目问题说明

需求背景

不使用CocoaPods将SQLCipher集成到KMM项目,需自行构建libSQLCipher.a静态库。

编译命令

执行以下命令完成静态库编译:

./configure --enable-tempstore=yes --with-crypto-lib=commoncrypto CFLAGS="
-DSQLITE_HAS_CODEC=1
-DSQLITE_TEMP_STORE=3 
-DSQLCIPHER_CRYPTO_CC
-DSQLITE_SOUNDEX 
-DSQLITE_THREADSAFE 
-DSQLITE_ENABLE_RTREE 
-DSQLITE_ENABLE_STAT3 
-DSQLITE_ENABLE_STAT4 
-DSQLITE_ENABLE_COLUMN_METADATA 
-DSQLITE_ENABLE_MEMORY_MANAGEMENT 
-DSQLITE_ENABLE_LOAD_EXTENSION -DSQLITE_ENABLE_UNLOCK_NOTIFY 
-DSQLITE_ENABLE_FTS3_PARENTHESIS 
-DSQLITE_ENABLE_FTS4 
-DSQLITE_ENABLE_FTS4_UNICODE61 
-DSQLITE_ENABLE_JSON1 
-DSQLITE_ENABLE_FTS5 
-DHAVE_USLEEP=1 
-DSQLITE_MAX_VARIABLE_NUMBER=99999"
LDFLAGS="/usr/local/Cellar/openssl@1.1 /1.1.1l_1/lib/libcrypto.a"

make sqlite3.c

`xcrun --sdk iphoneos --find clang` -x c -target arm64-apple-ios8.0 -isysroot `xcrun --sdk iphoneos --show-sdk-path` -fmodules -DSQLITE_HAS_CODEC=1 -fstrict-aliasing -fembed-bitcode-marker -DSQLITE_HAS_CODEC -DSQLITE_TEMP_STORE=2 -DSQLITE_SOUNDEX -DSQLITE_THREADSAFE -DSQLITE_ENABLE_RTREE -DSQLITE_ENABLE_STAT3 -DSQLITE_ENABLE_STAT4 -DSQLITE_ENABLE_COLUMN_METADATA -DSQLITE_ENABLE_MEMORY_MANAGEMENT -DSQLITE_ENABLE_LOAD_EXTENSION -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_FTS4_UNICODE61 -DSQLITE_ENABLE_FTS3_PARENTHESIS -DSQLITE_ENABLE_UNLOCK_NOTIFY -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_FTS5 -DSQLCIPHER_CRYPTO_CC -DHAVE_USLEEP=1 -DSQLITE_MAX_VARIABLE_NUMBER=99999 -DNDEBUG -DSQLITE_HAS_CODEC -DSQLITE_TEMP_STORE=2 -DSQLITE_SOUNDEX -DSQLITE_THREADSAFE -DSQLITE_ENABLE_RTREE -DSQLITE_ENABLE_STAT3 -DSQLITE_ENABLE_STAT4 -DSQLITE_ENABLE_COLUMN_METADATA -DSQLITE_ENABLE_MEMORY_MANAGEMENT -DSQLITE_ENABLE_LOAD_EXTENSION -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_FTS4_UNICODE61 -DSQLITE_ENABLE_FTS3_PARENTHESIS -DSQLITE_ENABLE_UNLOCK_NOTIFY -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_FTS5 -DSQLCIPHER_CRYPTO_CC -DHAVE_USLEEP=1 -DSQLITE_MAX_VARIABLE_NUMBER=99999 -fno-objc-arc -fmodule-name=SQLCipher -Oz -fno-common -c sqlite3.c -o sqlite3.o

`xcrun --sdk iphoneos --find libtool` -static -arch_only arm64 -syslibroot `xcrun --sdk iphoneos --show-sdk-path` -o libSQLCipher.a sqlite3.o

问题现象

编译完成后将libSQLCipher.a导入Android Studio,按照KMM官方文档完成配置:创建.def文件、配置链接规则、在build.gradle中添加相关配置。可正常调用sqlite3_open()等基础方法,但无法访问sqlite3_key()、sqlite3_key_v2()、sqlite3_rekey()、sqlite3_rekey_v2()、sqlite3_activate_see()等加密相关方法。

查阅头文件发现加密相关方法定义在以下条件编译块中:

/* BEGIN SQLCIPHER */
#ifdef SQLITE_HAS_CODEC
 // sqlite3_key(), sqlite3_key_v2(), sqlite3_rekey(), sqlite3_rekey_v2(), 
sqlite3_activate_see() methods are defined here
#endif
/* END SQLCIPHER */

已按照SQLCipher官方要求在编译命令中添加SQLITE_HAS_CODEC宏定义,仍无法访问上述方法。


问题排查及解决思路
  • 加密库依赖冲突排查:configure命令中同时指定了--with-crypto-lib=commoncrypto(使用苹果系统自带加密库)和链接openssl的libcrypto.a,二者冲突会导致加密逻辑被跳过编译。修正方法是删除configure命令中的LDFLAGS配置,使用commoncrypto无需额外链接openssl库。
  • 静态库编译有效性验证:执行make sqlite3.c后,打开生成的sqlite3.c文件,搜索SQLITE_HAS_CODEC定义,确认宏是否被正确设置为1;编译生成libSQLCipher.a后,执行nm libSQLCipher.a | grep sqlite3_key,如果无对应符号输出,说明加密方法未被编译进静态库,需重新检查编译流程的宏定义传递是否正确。
  • KMM Cinterop配置修正:如果静态库存在对应加密符号,问题出在KMM绑定生成阶段。需在SQLCipher对应的.def文件中添加编译参数compilerOpts = -DSQLITE_HAS_CODEC=1,生成绑定时会读取该宏定义,展开头文件中的条件编译块暴露加密方法;同时检查build.gradle中的cinterop配置,确认静态库路径、链接规则配置正确。
  • 编译命令优化:clang编译阶段重复添加了多次相同的宏定义,可清理重复项避免不必要的配置错误。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 09:36:04