将SQLCipher与MonoTouch配合使用

时间:2012-02-26 21:13:03

标签: ios sqlite xamarin.ios sqlcipher entrypointnotfoundexcept

我编译了一个静态库并链接了SQLCipher和OpenSSL。完整的项目,makefile和编译库可以在这里找到:

https://github.com/anujb/SQLCipherNet

当我在正常的Objective-C Xcode项目中链接生成的库时,对sqlite3_key的调用工作正常。

我使用以下方法将同一个库链接到MonoTouch项目中:

-gcc_flags "-L${ProjectDir} -lsqlciphernet -force_load ${ProjectDir}/libsqlciphernet.a"

然后我修改了SQLite-NET以在每个SQLite3.Open(...)函数之后调用键函数:

[DllImport("__Internal", EntryPoint = "sqlite3_key")]
public static extern Result Key(IntPtr db, string key, int keyLength);

但是当调用Key方法时,我得到一个EntryPointNotFoundException。这是堆栈跟踪:

System.EntryPointNotFoundException has been thrown at:
at (wrapper managed-to-native) SQLite.SQLite3:Decrypt (intptr,string,int)
at SQLite.SQLiteConnection..ctor (System.String databasePath) [0x00031] in 
../SQLite.cs:108 

显然堆栈跟踪并不是特别有用,但我不知道从哪里开始调试这个问题。 HALP?

1 个答案:

答案 0 :(得分:2)

在为“Debug | iPhoneSimulator”构建解决方案时遇到同样的错误。但是,对于此配置,您的项目选项包含您提到的gcc_flags - 因此异常完全正常。

尝试构建“Debug | iPhone”配置(指定选项的位置)因路径问题而失败...但我很确定如果我修复它们会起作用; - )

<强>更新

将图书馆移到正确的位置会给我:

Undefined symbols for architecture armv6:   "___udivmodsi4",
referenced from:
      _sqlite3BitvecSet in libsqlciphernet.a(sqlite3.o)
      _sqlite3BitvecClear in libsqlciphernet.a(sqlite3.o)
      _sqlite3BitvecTest in libsqlciphernet.a(sqlite3.o) ld: symbol(s) not found for architecture armv6

我认为因为libopenssl而失踪?