Android JNI 找不到 C++ 标准库 header 文件
Android JNI doesn't find C++ standard library header files
我正在关注 android-studio-jni guide 并尝试使用 gradle 编译 C++ 本机代码。一切正常:我可以加载 JNI 函数、编写 C++ 类、编译、运行 和调试。而且我不需要编写和维护 Application.mk 和 Android.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_static
,system
等,我没全部试过,估计不行如果你使用一些基本的东西,比如 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)
如果有人解释一下。
我正在关注 android-studio-jni guide 并尝试使用 gradle 编译 C++ 本机代码。一切正常:我可以加载 JNI 函数、编写 C++ 类、编译、运行 和调试。而且我不需要编写和维护 Application.mk 和 Android.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_static
,system
等,我没全部试过,估计不行如果你使用一些基本的东西,比如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)
如果有人解释一下。