在Android Studio 2.3.2中生成具有NDK支持的新项目时,您不再在Android.mk
目录中自动生成jni/
文件。
您现在在CMakeLists.txt
目录中获得cpp/
。
不再有jni/
dir。
如果您仍希望将Android.mk
文件与ndk-build
而不是CMake
一起使用,该文件在哪里?
是否应该在cpp/
目录中创建?
或者它是否与app/
相同的CMakeLists.txt
目录?
如果您打算让Android Studio自动构建本机共享库而不是显式运行CMakeLists.txt
,那么在创建Android.mk
文件时是否必须删除ndk-build
文件? / p>
更新 - 链接到第三方库:
我已经生成了一堆libusb .so文件,即
~/projects/third-party/libusb-1.0.21/android/libs:
total used in directory 36 available 265852464
drwxrwxr-x 9 bph bph 4096 Jun 2 22:20 .
drwxr-xr-x 5 bph bph 4096 Jun 2 22:20 ..
drwxrwxr-x 2 bph bph 4096 Jun 5 14:05 arm64-v8a
drwxrwxr-x 2 bph bph 4096 Jun 5 14:05 armeabi
drwxrwxr-x 2 bph bph 4096 Jun 5 14:05 armeabi-v7a
drwxrwxr-x 2 bph bph 4096 Jun 5 14:05 mips
drwxrwxr-x 2 bph bph 4096 Jun 5 14:05 mips64
drwxrwxr-x 2 bph bph 4096 Jun 5 14:05 x86
drwxrwxr-x 2 bph bph 4096 Jun 5 14:05 x86_64
mips64 /的内容如下所示:
~/projects/third-party/libusb-1.0.21/android/libs/mips64:
total used in directory 276 available 265852464
drwxrwxr-x 2 bph bph 4096 Jun 5 14:05 .
drwxrwxr-x 9 bph bph 4096 Jun 2 22:20 ..
-rwxr-xr-x 1 bph bph 14872 Jun 5 14:05 dpfp
-rwxr-xr-x 1 bph bph 14944 Jun 5 14:05 dpfp_threaded
-rwxr-xr-x 1 bph bph 27432 Jun 5 14:05 fxload
-rwxr-xr-x 1 bph bph 10680 Jun 5 14:05 hotplugtest
-rwxr-xr-x 1 bph bph 127544 Jun 5 14:05 libusb1.0.so
-rwxr-xr-x 1 bph bph 10624 Jun 5 14:05 listdevs
-rwxr-xr-x 1 bph bph 10712 Jun 5 14:05 sam3u_bphchmark
-rwxr-xr-x 1 bph bph 14912 Jun 5 14:05 stress
-rwxr-xr-x 1 bph bph 35640 Jun 5 14:05 xusb
即。交叉构建的.so文件就在那里..
在CMakeLists.txt中,我的link_directories如下所示:
link_directories( ~/projects/third-party/libusb-1.0.21/android/libs/${ANDROID_ABI}/
我的target_link_libraries看起来像这样:
target_link_libraries( # Specifies the target library.
usb-1.0 )
但我收到错误链接:
~/Android/Sdk/ndk-bundle/toolchains/mips64el-linux-android-4.9/prebuilt/linux-x86_64/lib/gcc/mips64el-linux-android/4.9.x/../../../../mips64el-linux-android/bin/ld: cannot find -lusb-1.0
好像link_directories没有被选中,或者$ {ANDROID_ABI}没有工作?
build.gradle文件的mod对链接器错误没有任何影响吗?
答案 0 :(得分:1)
在您的build.gradle文件(应用)中,添加externalNativeBuild
的{{1}} 和defaultConfig
buildTypes
点path
到Android.mk文件。
externalNativeBuild {
ndkBuild {
path file("../../gameSource/Android.mk")
}
}
另外,请考虑切换到CMakeLists。它构建得更快。
编辑:破解Android.mk,以便在运行ndk-build时打印出一个文件列表,而不是构建库。
$(info "--sources--")
$(foreach file,$(LOCAL_SRC_FILES),$(info $(file)))
$(info "--headers--")
$(foreach file,$(LOCAL_C_INCLUDES),$(info $(file)))
然后在脚本末尾附近注释掉BUILD_SHARED_LIBRARY
命令。
像往常一样运行ndk-build,但使用> out.txt
将输出重定向到文件。
这些是源文件和包含目录,在您的主要CMakeLists所在的项目的名为“libusb”的子目录中创建一个CMakeLists.txt文件,并开始配置文件并将其添加到库目标。
set( USBLIB_SRC
... # source files
)
set( USB_LIB_INC
... # include dirs
)
# Copy these flags from the USBLib Android.mk
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D__ANDROID__ -DANDROID -D(etc...)")
add_library(libusb STATIC ${USBLIB_SRC})
target_include_directories(sexykanji PUBLIC ${USBLIB_INC})
然后,在主CMake列表中,包含'libusb'目录:
#########################################################
# import libusb library
#########################################################
add_subdirectory(libusb)
并将我们之前设置的库名称添加到target_link_libraries
。
修改 :将预建的.so
添加到CMakeLists。
include_directories( ../../libusb/include ... )
link_directories(
../../libusb/lib/${ANDROID_ABI}/
...
)
target_link_libraries(
usb
...
)
在Gradle文件中,defaultConfig
:
sourceSets{
main {
// let gradle pack the shared library into apk
jniLibs.srcDirs += '../../libusb/lib/'
}
}