【发布时间】:2015-09-17 22:35:16
【问题描述】:
我正在将一个现有的工作项目从 Eclipse 迁移到 Android Studio。代码库由一个使用 NDK (libMylib.so) 构建的本机 C++ 库、一个包装所有本机代码的 Java 类 (MyClass.java) 和一个测试工具 (MyApp) 组成。
在 Android Studio 中,我创建了一个构建“MyClass”的独立项目(不仅仅是一个模块),并且该项目有一个“src/main/jniLibs”文件夹,我在其中放置“libMyLibrary.so”。
项目构建并生成“MyClass.aar”,其中包含其所有依赖项——包括那些 .so 文件。
我的测试应用将此 .aar 文件作为新的依赖“模块”导入。它构建并部署到设备,但在尝试调用 .so 文件中包含的本机方法时遇到运行时异常。
Trying to load lib /data/data/com.mycompany.webview/lib/libMylib.so 0x4131cd18
Added shared lib /data/data/com.mycompany.webview/lib/libMylib.so 0x4131cd18
nativeCalls.cpp﹕ JNI_OnLoad() called successfully.
No implementation found for native Lcom/mycompany/Mylib/MyClass;.nativeInit
Shutting down VM
“JNI_OnLoad()”中打印的调试语句是我的,所以我知道正确的 .so 正在加载而没有问题。但随后对“nativeInit()”的调用出现了问题。
什么样的事情会导致这种失败?
谢谢。
【问题讨论】:
-
您是使用
ndk-build构建 libMylib.so 还是依赖 Gradle NDK 支持?在后一种情况下,发布您的build.gradle。无论如何,在JNI_OnLoad()的日志中添加更多输出,以确保这不是加载的库的旧版本。 -
本机代码使用 ndk-build 在命令行上构建。然后将 .so 文件复制到 MyLibrary 的相应目录 (jniLibs) 中。它与我目前在产品中使用的库的版本相同,并且使用 Eclipse 正确构建。没有代码更改。
-
NDK 带有一个很好的
nm命令(您可以在您正在使用的工具链的prebuilt/…/bin目录中的某个位置找到它)。在您从 APK 中手动提取的 libMylib.so 上运行此nm -D,以了解是否真的缺少 MyClass.nativeInit() 方法的实现。 -
非常感谢您指出该工具。请参阅我在下面的评论中发现的困难。这个工具可能会很快让它变得明显。
标签: android-studio android-ndk aar