【发布时间】: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 这确实是一个钛问题(见我的回答)。感谢您的帮助。