当在AndroidStudio2.3.2中生成具有NDK支持的新项目时,您将不再获得在Android.mk dir中自动生成的jni/文件。
现在,您可以在CMakeLists.txt dir中得到一个cpp/。
再也没有jni/ dir了。
如果您仍然希望将Android.mk文件与ndk-build一起使用,而不是CMake,那么该文件到哪里去呢?
应该在cpp/ dir中创建它吗?
还是在app/ dir中与CMakeLists.txt相同?
如果您打算让Android自动构建本机共享库而不是显式运行CMakeLists.txt,那么如果您要创建一个Android.mk文件,就必须删除Android.mk文件吗?
更新-链接到第三方库:
我生成了一堆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 64的内容如下:
~/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文件的模块不会对链接器错误有任何影响,对吗?
发布于 2017-06-03 01:16:51
在build.gradle文件(应用程序)中,在defaultConfig和buildTypes的外部添加一个指向Android.mk文件的path。
externalNativeBuild {
ndkBuild {
path file("../../gameSource/Android.mk")
}
}另外,考虑切换到CMakeLists。它的建造要快得多。
编辑:黑客Android.mk,以便当您运行ndk-构建它打印出一个文件列表,而不是构建库。
$(info "--sources--")
$(foreach file,$(LOCAL_SRC_FILES),$(info $(file)))
$(info "--headers--")
$(foreach file,$(LOCAL_C_INCLUDES),$(info $(file)))然后在脚本结尾处注释掉BUILD_SHARED_LIBRARY命令。
像往常一样运行ndk-构建,但是使用> out.txt将输出重定向到一个文件。
这些是源文件和包含目录,在主CMakeLists.txt驻留的项目的子目录“libusb”中创建一个CMakeLists文件,并开始配置这些文件并将其添加到库目标中。
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})然后,在主CMakeLists中,包括'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
...
)在defaultConfig内部的Gradle文件中
sourceSets{
main {
// let gradle pack the shared library into apk
jniLibs.srcDirs += '../../libusb/lib/'
}
}https://stackoverflow.com/questions/44338009
复制相似问题