Android JNI 找不到 C++ 标准库 header 文件

Android JNI doesn't find C++ standard library header files

我正在关注 android-studio-jni guide 并尝试使用 gradle 编译 C++ 本机代码。一切正常:我可以加载 JNI 函数、编写 C++ 类、编译、运行 和调试。而且我不需要编写和维护 Application.mkAndroid.mk makefile;它们似乎都由 gradle 隐式处理。只有一件事我不明白:How to include C++ header files from the standard libraries?

我想我一定是在 gradle 脚本中漏掉了一些东西,但是我找不到关于在此处添加什么的好的参考。这是脚本:

android.ndk {
    moduleName = "hello-android-jni"

    // I tried adding the following, but nothing happens
    stl = "stlport_static"
}

以及显示所有标准 header 均不可见的屏幕截图。

"your-path-to-ndk-bundle"\platforms\android-21\arch-arm\usr\include

我在那里没有看到 iostream,因此您无法导入它。您可以尝试将额外的库放在那里和其他处理器包含文件夹。

需要做一些事情才能让它发挥作用:

  • 将文件扩展名从 .c 更改为 .cpp 以便 ndk 将使用 g++ 而不是 gcc 编译文件。
  • 添加stl配置如stl = "stlport_static",其他选项有gnustl_staticsystem等,我没全部试过,估计不行如果你使用一些基本的东西,比如 std::string,那真的很重要。

  • 单击下面屏幕截图中所示的同步按钮。问题是,即使它说完成同步,也需要一些额外的时间来索引文件并从 stl 中找到 header。 所以请耐心等待,不要着急。耐心一点,不要着急。 我大概需要10秒左右。如果您在菜单栏上找不到此同步,也可以在 工具 > Android > 将项目与 Gradle 文件同步 下找到。

  • 最后,将代码更新为C++并进行测试:

    #include <jni.h>
    #include <iostream>
    
    extern "C" {
    
    JNIEXPORT jstring JNICALL
    Java_com_yuchen_helloandroidjni_MainActivity_getMsgFromJni(JNIEnv *env, jobject instance) {
    
        // TODO
        std::string message = "Hello World From Jni";
    
        return env->NewStringUTF(message.c_str());
    }
    }
    

现在应该可以无缝运行了。去本土,是的!


编辑:

我不知道我们需要把代码放在 extern "C" { ... } 下。但这似乎很重要,否则,我们将出现错误:

java.lang.UnsatisfiedLinkError: No implementation found for void com.yuchen.helloandroidjni.getMsgFromJni() (tried Java_com_yuchen_helloandroidjni_MainActivity_getMsgFromJni)

如果有人解释一下。