如何将简单的jni示例从Cmake转换为ndk-build?

时间:2017-01-31 19:50:11

标签: android-studio android-ndk

我是一名长期的程序员,但对Android Studio来说是新手。我继承了一些现有的JNI库代码,用于运行已经拥有Android.mk文件的ndk-build。重用它会很好。当我使用Android Studio打开一个新项目并设置C ++支持标志时,它将自己设置为使用CMake而不是ndk-build。 Android Studio的文档说两者都可用,所以我决定尝试一个简单的测试,看看我是否找到了所有需要更改的地方。这是一个完全失败的错误消息,似乎无处可去。

要重新创建,请使用Android Studio创建一个新项目ProjTest2,然后选中Include C ++ Support框。使用API​​ 16的最低SDK:Android 4.1接受默认的手机和平板电脑外形。选择空活动。接受默认的活动和布局名称。接受默认工具链,不要选中“例外支持”或“运行时”框。运行程序,选择设备Android Emulator Nexus_5_API_24:5554。一切都很好;在仿真器屏幕上从C ++获取消息Hello。

尝试更改为ndk-build。打开Module:app的build.grade文件。替换行:

externalNativeBuild {
    cmake {
        path "CMakeLists.txt"
    }
}

使用:

externalNativeBuild {
    ndkBuild {
        path "jni/Android.mk"
    }
}

在ProjTest2 / app目录中创建一个新文件夹jni。使用以下内容在该文件夹中创建文件Android.mk:

# A simple test for the minimal standard C++ library
#

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := native-lib
LOCAL_SRC_FILES := $(LOCAL_PATH)/../src/main/cpp/native-lib.cpp
LOCAL_LDLIBS    := -llog -landroid
include $(BUILD_SHARED_LIBRARY)

现在构建失败声称无法找到#include< string>的目标并且它无法解析容器'std'。我发现我可以通过向Android添加LOCAL_C_INCLUDES + = C:\ Users \ JWC \ AppData \ Local \ Android \ sdk \ ndk-bundle \ sources \ cxx-stl \ gnu-libstdc ++ \ 4.9 \ include来清除IDE错误标志.mk文件但是当它无法从< string>中找到一些子包含时,结果make仍然失败。

我是否错过了一些简单的东西,或者这不像它应该的那样简单?

编辑:

还需要文件:

# Application.mk

APP_ABI := armeabi-v7a armeabi
APP_PLATFORM := android-21
APP_OPTIM := release

APP_STL := gnustl_static

1 个答案:

答案 0 :(得分:0)

CMake默认使用gnustl_static STL,而ndk-build默认使用none。

将以下内容添加到您的项目中:

JNI / Application.mk:

APP_STL := gnustl_static

有一些可用。 gnustl_static将与cmake使用匹配,但您可以在official docs中看到其他选项。