Android NDK,CMake与其他库

时间:2016-06-13 02:06:48

标签: android-ndk cmake

所以我正在尝试使用Android Studio上的Android NDK构建和测试CMake。我可以让我的库进行编译,但它似乎不想拉动任何第三方依赖。我一直在阅读工具链并寻找更好的文档,没有运气。有人可以告诉我,如果我失踪了吗?

cmake_minimum_required(VERSION 3.4.1)

set(SFML_PATH ${ANDROID_NDK}/sources/sfml)
set(SFML_LIB_PATH ${SFML_PATH}/lib/${ANDROID_NDK_ABI_NAME})

set(SFML_LIB_SYSTEM ${SFML_LIB_PATH}/libsfml-system.so)
set(SFML_LIB_AUDIO ${SFML_LIB_PATH}/libsfml-audio.so)
set(SFML_LIB_GRAPHICS ${SFML_LIB_PATH}/libsfml-graphics.so)
set(SFML_LIB_NETWORK ${SFML_LIB_PATH}/libsfml-network.so)
set(SFML_LIB_WINDOW ${SFML_LIB_PATH}/libsfml-window.so)
set(SFML_LIB_ACTIVITY ${SFML_LIB_PATH}/libsfml-activity.so)
set(SFML_LIB_MAIN ${SFML_LIB_PATH}/libsfml-main.a)


set(SFML_LIBS ${SFML_LIB_SYSTEM} ${SFML_LIB_GRAPHICS} ${SFML_LIB_AUDIO} ${SFML_LIB_WINDOW} ${SFML_LIB_ACTIVITY})

include_directories(${SFML_PATH}/include)
link_directories(${SFML_LIB_PATH})

add_library(native-lib SHARED
    src/main/cpp/native-lib.cpp)

target_link_libraries(native-lib log ${SFML_LIBS})

#file(COPY ${SFML_LIBS} DESTINATION ${__android_install_path})
FOREACH(SFML_LIB ${SFML_LIB})
    execute_process( COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${SFML_LIB}" "${LIBRARY_OUTPUT_PATH}/${SFML_LIB}" RESULT_VARIABLE __fileCopyProcess )
    MESSAGE("Lib: ${SFML_LIB}")
ENDFOREACH(SFML_LIB)

以上是我的CMakeLists.txt。我已经做了一些小的黑客攻击,用SFML编译路径,因为我还没有找到关于CMake和Android的好文档。

2 个答案:

答案 0 :(得分:6)

您可以添加更多信息: “但它似乎并不想吸引任何第三方依赖。”?

这一个:
https://github.com/googlesamples/android-ndk/tree/master/hello-libs 有静态和共享的第三方库,你可以试试。

对于共享的依赖lib,你需要将它们打包到APK中,这是在gradle中完成的,cmake不会这样做。
上面的例子表明,基本上他们需要被复制到你的app / src / main / jniLibs中,所以他们将被打包到apk,并推送到你的Android手机/平板电脑。在运行时,它们可以被加载 我试图将一组库放在一个目录中,然后使用

  • link_directories(...)

然后将lib名称直接放入

  • target_link_libraries(...)

也有效。确保您有适合您的应用程序支持的ABI的库[看起来您只是为一个ABI构建]。

答案 1 :(得分:3)

这个过程可能需要很长时间,这取决于你的Android技能。

一个例子可能类似于这个过程:

  • Crosscompile sfml。
  • 创建您的jni bridge
  • 使用cmake生成项目并编译
  • 将文件复制到android studio。创建java加载库代码。

我猜你已经交叉编译了sfml,你知道如何运行交叉编译过程,如果我错了,请查看以下链接:

教程: https://github.com/SFML/SFML/wiki/Tutorial:-Building-SFML-for-Android

源代码: https://github.com/SFML/SFML

工具链: https://github.com/SFML/SFML/blob/master/cmake/toolchains/android.toolchain.cmake

你的cmake的变化: 添加此文件

FIND_PACKAGE(SFML required)

在cmake中放入你的SFML构建目录,cmake将填充你的VARIABLES 自动例如这个变量:

set(SFML_PATH ${ANDROID_NDK}/sources/sfml)
set(SFML_LIB_PATH ${SFML_PATH}/lib/${ANDROID_NDK_ABI_NAME})

set(SFML_LIB_SYSTEM ${SFML_LIB_PATH}/libsfml-system.so)
set(SFML_LIB_AUDIO ${SFML_LIB_PATH}/libsfml-audio.so)
set(SFML_LIB_GRAPHICS ${SFML_LIB_PATH}/libsfml-graphics.so)
set(SFML_LIB_NETWORK ${SFML_LIB_PATH}/libsfml-network.so)
set(SFML_LIB_WINDOW ${SFML_LIB_PATH}/libsfml-window.so)
set(SFML_LIB_ACTIVITY ${SFML_LIB_PATH}/libsfml-activity.so)
set(SFML_LIB_MAIN ${SFML_LIB_PATH}/libsfml-main.a) 

有两种方法可以制作android studio原生应用程序:

简单方法: 创建JNI桥:

交叉编译你的cmake脚本并将你的lib复制到app / src / main / jniLibs

在执行时间添加库

代码:

try
{
  Log.v(LOG_TAG, "adding your library");
  System.loadLibrary(your_library);
}
catch(UnsatisfiedLinkError e)
{
 Log.e(LOG_TAG,e.getMessage());
}

更完整的方式(它允许调试库)

在gradle中创建您的ndk模块 示例

android.ndk {
    moduleName = "your_library"
    cppFlags.add("-fexceptions")
    //cppFlags.add("-std=c++11")
    //cFlags.add("-fopenmp")
    cppFlags.add("-I" + file("src/main/jni").absolutePath)
    stl = "gnustl_shared" // Which STL library to use: gnustl or stlport
    ldLibs.addAll(["android", "EGL", "GLESv2", "dl", "log", "z"])
    String libsDir = curDir.absolutePath + "/src/main/jniLibs/armeabi/"
    ldLibs.add(libsDir + "your_native_lib.so")
}