繁体   English   中英

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

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

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

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

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

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

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

在此输入图像描述 在此输入图像描述

为了使其工作,有些事情需要做:

  • 将文件扩展名从.c更改为.cpp,以便ndk将使用g ++而不是gcc编译文件。
  • 添加stl配置,例如stl = "stlport_static" ,其他选项是gnustl_staticsystem等等。我没有尝试过它们,但我想如果你使用一些基本的东西,如std::string这并不重要。

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

    在此输入图像描述

  • 最后,将代码更新为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:找不到void com.yuchen.helloandroidjni.getMsgFromJni()的实现(尝试过Java_com_yuchen_helloandroidjni_MainActivity_getMsgFromJni)

如果有人解释这个。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM