我知道我们可以编写一些Java本机方法来测试JNI的C / C ++代码,但是它需要花费太多时间而且大多数C / C ++代码都不需要从Java访问,有没有办法测试他们以编程方式?
答案 0 :(得分:0)
你的问题有两个方面。
如果要对通常在Java Android应用程序上下文中使用的基础C / C ++代码进行单元测试,可以使用googletest。 Android NDK(third_party/googletest
)附带 googletest ,用于测试NDK本身。 Here您可以找到运行此类单元测试的分步说明。
这个C代码通常是跨平台的,并且为构建机器编译它并且在没有Android设备或模拟器的情况下测试本地也很有意义。
但是这种方法无法测试实际使用JNI函数的C代码(例如那些负责从Java对象或数据类型转换为C / C ++并返回的代码)。虽然最佳做法是保持这样的包装简洁,但实际情况常常迫使我们将一些非平凡的逻辑放入这些函数中。即使它很简单,也应该是可以测试的。
要 unittest 本机方法,您必须 a)模拟底层C ++图层, b)模拟调用此本机的Java类方法, c)模拟从本机代码调用的任何Java方法。然后,您可以使用 JUnit 在设备或模拟器上运行测试。您的代码应该以允许这种解构的方式设计。特别是,您需要遵守规则,即JNI回调仅位于包装类中,并且核心中不使用与Java相关的代码。
实际上,如果设计足够干净并且角色分离足够严格,您可以在主机上运行这些Java测试,而不是使用Android设备或模拟器。您的C ++代码应该能够使用没有NDK扩展的主机工具链构建(例如__android_log_print()
),并且也可以在没有Android环境的情况下运行(例如,您可以FindClass("java/util/ArrayList")
,但不能FindClass("android/util/SparseArray")
)。< / p>
不幸的是,Android Studio似乎无法为此提供帮助,但我们使用单独的原生 cmake 来构建使用主机C编译器的单元测试。当然,这些测试无法取代设备端测试,但它们在CI环境中具有无可估量的价值。
<强>更新强>
如果您对此主题感兴趣,请务必通过Android JUnit Testing for Native Libraries阅读Suresh Joshi。