ptD*_*ave 14 cmake android-ndk
所以我想在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)
Run Code Online (Sandbox Code Playgroud)
以上是我的CMakeLists.txt.我已经做了一些小的黑客攻击,用SFML和路径进行编译,因为我还没有找到关于CMake和Android的好文档.
您可以添加更多信息:"但它似乎不想拉过任何第三方依赖项."?
这个:
https://github.com/googlesamples/android-ndk/tree/master/hello-libs
有静态和共享的第三方库,你可以尝试一下.
对于共享依赖库,您需要将它们打包到APK中,这是在gradle内完成的,cmake不会这样做.
上面的例子表明,基本上他们也需要被复制到你的app/src/main/jniLibs中,所以他们将被打包到apk,并推送到你的Android手机/平板电脑.在运行时,它们可以加载.
我试图将一组库放在一个目录中,然后使用
然后直接将lib名称放入
也有效.确保您为您的应用程序支持的ABI拥有正确的库[看起来您只是为一个ABI构建].
该过程可能会有点长,这取决于您的 Android 技能。
一个示例可能类似于此过程:
我猜你已经交叉编译了 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)
Run Code Online (Sandbox Code Playgroud)
在 cmake 中放置您的 SFML 构建目录,cmake 将自动填充您的变量,例如以下变量:
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)
Run Code Online (Sandbox Code Playgroud)
制作 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());
}
Run Code Online (Sandbox Code Playgroud)
更完整的方法(它允许调试库)
在 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")
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12109 次 |
| 最近记录: |