【问题标题】:Android Studio -- linking with a .aar that contains a .soAndroid Studio - 与包含 .so 的 .aar 链接
【发布时间】: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


【解决方案1】:

1) JNI_OnLoad() 返回什么值?在我拥有的代码中是JNI_VERSION_1_6

2) 函数名是否正确?

cd bin/classes
javah com.example.MyClass com.example.OneMoreClass

这将为您的本机函数生成正确的 C/C++ 标头。

【讨论】:

  • 源代码没有变化。我只是将现有的 MyLibrary.so 和 MyClass.java 放入 Android Studio 中。所以没有方法签名改变或类似的东西。我将尝试在 JNI_OnLoad() 周围添加更多调试语句,但除了设置全局 JVM 变量之外,它并没有做太多。
  • 发现问题。愚蠢的新手错误——Android Studio 沿线某处更改了包名称的大小写,我需要手动使本机调用匹配。噗!
猜你喜欢
  • 2018-10-18
  • 1970-01-01
  • 1970-01-01
  • 2016-09-04
  • 2017-10-14
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 2016-08-02
相关资源
最近更新 更多