【问题标题】:Unable to load native library when running titanium android app运行钛金安卓应用时无法加载本机库
【发布时间】:2013-11-12 14:05:22
【问题描述】:

我正在使用 Titanium 构建一个 Android 应用。 我的 Android 模块 com.tgl.androidmodule 包含一个名为 libAlibrary-jni.so 的本机库。

在我的 .apk 中,本机库存在于其正确的文件夹中(lib/armeabi、lib/armeabi-v7a、lib/x86),但尝试动态加载库时仍然出现错误:System.loadLibrary("Alibrary-jni");

这是错误的完整堆栈跟踪:

11-12 08:46:00.654: D/dalvikvm(381): Trying to load lib /data/data/com.fw.test/lib/libstlport_shared.so 0x41e407e8
11-12 08:46:00.669: D/AndroidmoduleModule(381): (main) [18,433] inside onAppCreate
11-12 08:46:00.669: D/dalvikvm(381): Trying to load lib /data/data/com.fw.test/lib/libAlibrary-jni.so 0x41e407e8
11-12 08:46:00.719: D/dalvikvm(381): Added shared lib /data/data/com.fw.test/lib/libstlport_shared.so 0x41e407e8
11-12 08:46:00.719: D/dalvikvm(381): No JNI_OnLoad found in /data/data/com.fw.test/lib/libstlport_shared.so 0x41e407e8, skipping init
11-12 08:46:00.719: D/dalvikvm(381): Trying to load lib /data/data/com.fw.test/lib/libkroll-v8.so 0x41e407e8
11-12 08:46:00.879: D/dalvikvm(381): Added shared lib /data/data/com.fw.test/lib/libkroll-v8.so 0x41e407e8
11-12 08:46:01.039: D/dalvikvm(381): Added shared lib /data/data/com.fw.test/lib/libAlibrary-jni.so 0x41e407e8
11-12 08:46:01.054: D/dalvikvm(381): No JNI_OnLoad found in /data/data/com.fw.test/lib/libgeniusscanlibrary-jni.so 0x41e407e8, skipping init
11-12 08:46:01.959: E/TiApplication(381): (KrollRuntimeThread) [345,345] Sending event: exception on thread: KrollRuntimeThread msg:java.lang.UnsatisfiedLinkError: Couldn't load com.tgl.androidmodule: findLibrary returned null; Titanium 3.1.3,2013/09/18 12:01,222f4d1
11-12 08:46:01.959: E/TiApplication(381): java.lang.UnsatisfiedLinkError: Couldn't load com.tgl.androidmodule: findLibrary returned null
11-12 08:46:01.959: E/TiApplication(381):     at java.lang.Runtime.loadLibrary(Runtime.java:365)
11-12 08:46:01.959: E/TiApplication(381):     at java.lang.System.loadLibrary(System.java:535)
11-12 08:46:01.959: E/TiApplication(381):     at org.appcelerator.kroll.runtime.v8.V8Runtime.loadExternalModules(V8Runtime.java:114)
11-12 08:46:01.959: E/TiApplication(381):     at org.appcelerator.kroll.runtime.v8.V8Runtime.initRuntime(V8Runtime.java:81)
11-12 08:46:01.959: E/TiApplication(381):     at org.appcelerator.kroll.KrollRuntime.doInit(KrollRuntime.java:175)
11-12 08:46:01.959: E/TiApplication(381):     at org.appcelerator.kroll.KrollRuntime$KrollRuntimeThread.run(KrollRuntime.java:109) 

有什么建议吗?

【问题讨论】:

  • 您的自定义库 已找到并加载,但 Titanium 的东西似乎有异常处理,这掩盖了正在发生的真正错误。一种可能性是本机函数名称与预期的 java 类名称不匹配,另一种可能性是它正在尝试加载另一个缺少的库。但是我们真的需要知道比这里的自定义异常处理程序更多的细节。您可能必须检查源代码,或者如果您不这样做,请与有权访问该源代码的人一起解决问题。 strace 或 ndk 调试器可能是另一种选择。
  • 是的@ChrisStratton,看来你是对的(库已正确加载),因为我的模块中的方法onAppCreate 已正确执行,并且发生在模块加载之前。看来我的本机函数名称也是正确的,因为当我在 onAppCreate 中调用来自 libAlibrary-jni.so 的方法时,它们已成功执行。
  • 您可能应该使用 Titanium 支持来追求这一点,除非您可以提供该异常处理程序的源代码及其保护的内容。
  • @ChrisStratton 这确实是一个钛问题(见我的回答)。感谢您的帮助。

标签: android titanium native


【解决方案1】:

实际上,这个问题与我的 C++ lib 无关,这是一个纯 Titanium 问题。感谢Jira issue,我明白我只需要安装gperf 即可解决此问题。无需说错误消息具有误导性。感谢 Chris Stratton 的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-02
    相关资源
    最近更新 更多