微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我正在关注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


解决方法:

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

>将文件扩展名从.c更改为.cpp,以便ndk将使用g而不是gcc编译文件.
>添加stl配置,例如stl =“stlport_static”,其他选项是gnustl_static,系统等等.我没有尝试过所有这些但我想如果你使用一些基本的东西,如std :: string,这并不重要.
>单击同步按钮,如下面的屏幕截图所示. getcha是即使它说完成同步,也需要一些额外的时间来索引文件并从stl找到标头.所以要耐心,不要急于求成.要有耐心,不要急于求成.我需要大约10秒左右.如果您在菜单栏上找不到此同步,则也可以在工具>下找到它. Android>将Poroject与Gradle文件同步.

enter image description here


>最后,将代码更新为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)

如果有人解释这个.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐