【问题标题】:How do I convert a simple jni example from Cmake to ndk-build?如何将简单的 jni 示例从 Cmake 转换为 ndk-build?
【发布时间】:2017-01-31 19:50:10
【问题描述】:

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

要重新创建,请使用 Android Studio 创建一个新项目 ProjTest2 并选中包含 C++ 支持框。接受具有 API 16 最低 SDK 的默认手机和平板电脑外形尺寸:Android 4.1。选择空活动。接受默认的活动和布局名称。接受默认工具链,不要选中 Exceptions Support 或 Runtime 框。运行程序,选择设备 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 的目标并且它无法解析容器'std'。我发现我可以通过将 LOCAL_C_INCLUDES += C:\Users\JWC\AppData\Local\Android\sdk\ndk-bundle\sources\cxx-stl\gnu-libstdc++\4.9\include 添加到 Android 来清除 IDE 错误标志.mk 文件,但是当它无法从 中找到某些子包含时,生成的 make 仍然失败。

我是否错过了一些简单的事情,或者这并不像看起来那么容易?

编辑:

还需要文件:

# Application.mk

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

APP_STL := gnustl_static

【问题讨论】:

    标签: android-studio android-ndk


    【解决方案1】:

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

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

    jni/Application.mk:

    APP_STL := gnustl_static
    

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

    【讨论】:

    • 添加该行似乎没有效果。包含和类仍然未定义。我将该行放在包含 $(CLEAR_VARS) 行之后。位置重要吗?
    • 正如我的回答所说,它应该放在 Application.mk 中。
    • 是的,我明白了。我完全错过了 Application.mk。添加在原始问题的编辑中注明的文件修复了它。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多