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

时间:2016-03-04 19:16:49

标签: android c++ java-native-interface

我正在关注android-studio-jni guide并尝试使用gradle编译C ++本机代码。一切都很好:我可以加载JNI函数,编写C ++类,编译,运行和调试。而且我不需要编写和维护 Application.mk Android.mk makefile;这两个似乎都是由gradle隐式处理的。只有一件事我不明白:如何在标准库中包含C ++头文件?

我想我一定错过了gradle脚本中的内容,但是我找不到关于在这里添加什么的好参考。这是脚本:

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

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

屏幕截图显示所有std标头都不可见。

enter image description here enter image description here

2 个答案:

答案 0 :(得分:2)

要使其发挥作用,还需要做些事情:

  • 将文件扩展名从 .c 更改为 .cpp ,以便ndk将使用g ++而不是gcc编译文件。
  • 添加minimize等stl配置,其他选项包括stl = "stlport_static"gnustl_static等。我还没有尝试过所有这些,但我想这并不重要如果您使用的是system等基本内容。

  • 点击同步按钮,如下面的屏幕截图所示。 getcha是即使它说完成同步,也需要一些额外的时间来索引文件并从stl找到标头。 请耐心等待,不要急于求成。要有耐心,不要急于求成。我需要大约10秒钟。如果您在菜单栏上找不到此同步,则也可以在工具>下找到该同步。 Android>将Poroject与Gradle文件同步

    enter image description here

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

    std::string

现在它应该无缝地工作。去当地,是的!

编辑:

我不确切地知道我们需要将代码放在#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()); } } 下面。但它似乎很重要,否则,我们会有错误:

  

java.lang.UnsatisfiedLinkError:找不到void com.yuchen.helloandroidjni.getMsgFromJni()的实现(尝试过Java_com_yuchen_helloandroidjni_MainActivity_getMsgFromJni)

如果有人解释这个。

答案 1 :(得分:0)

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

我在那里看不到iostream,所以你无法导入它。您可以尝试在其中添加额外的库,并将其添加到其他处理器包含文件夹。