Android NDK 上的单元测试

23
如何在Android本地代码(原生C/C++,而不是Java)上运行单元测试?到目前为止,我只找到了一个类似的问题和答案 (链接) 建议使用JNI来使用junit,但我不想这样做(添加JNI调用似乎对单元测试而言过于复杂,并且实际上也不是对原生代码的单元测试)。
CppUnit(也在那里建议)真的适用于Android吗?注意,我希望测试能够在设备上本地运行,而不是在主机开发环境上运行。 看起来像是一个安卓移植版本,值得一看吗?
Google官方的测试框架,如googletest ,将是理想的选择,但似乎与NDK无法兼容。
1个回答

18

我通过NDK使用googletest,我使用$(call import-module将主要的.so引入,然后在可执行文件中有一个单独的文件,看起来像

int main(int argc, char *argv[])
{
#if RUN_GTEST
    INIT_GTESTS(&argc,(char**)argv);
    RUN_ALL_GTESTS();
#endif
}

然后我使用BUILD_EXECUTABLE构建它,像这样部署:

find libs/ -type f -print -exec adb push {} /data/local/tmp \;

并像这样运行它

adb shell LD_LIBRARY_PATH=/data/local/tmp:/vendor/lib:/system/lib /data/local/tmp/gtest

所以它并没有测试应用程序生命周期,而是测试了所有单元测试。

如果我需要测试UI界面,我可以做类似的事情,但将现在的“main”作为本机函数,并在加载活动时调用它。


谢谢!我们会检查一下。我没意识到你也可以构建可执行文件。 - Indivara
另外,您可以构建并链接 gtest_main.cc。 - PSyton
假设我想要实际使用JNI调用,我该如何获取或创建JavaVM*? - syvex
1
@syvex,只需实现 jint JNI_OnLoad(JavaVM* vm, void* reserved); 并存储 JavaVM * - Toochka
JNI_OnLoad应该如何工作?这是一个纯C++可执行文件。 - Lothar
十年后这还可行吗?Shell 向我打印 “Segmentation fault” ,但没有其他信息,logcat 中也没有任何东西。 - natario

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接