Android NDK Android.mk 在 Android Studio 2.3.2 中的位置
Android NDK Android.mk location in Android Studio 2.3.2
在 Android Studio 2.3.2 中生成支持 NDK 的新项目时,您不会再在 jni/
目录中自动生成 Android.mk
文件。
您现在在 cpp/
目录中得到一个 CMakeLists.txt
。
没有 jni/
目录了。
如果您仍然希望使用带有 ndk-build
而不是 CMake
的 Android.mk
文件,该文件放在哪里?
是否应该在 cpp/
目录中创建?
或者它是否进入与 CMakeLists.txt
相同的 app/
目录?
如果您打算 Android Studio 自动构建本机共享库而不是 [=73],则创建 Android.mk
文件时是否必须删除 CMakeLists.txt
文件=] ndk-build
明确?
更新 - 链接到第 3 方库:
我生成了一堆 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 不会对链接器错误有任何影响吧?
在您的 build.gradle 文件(应用程序)中添加 externalNativeBuild
outside of the defaultConfig
and buildTypes
with a path
指向 Android.mk 文件。
externalNativeBuild {
ndkBuild {
path file("../../gameSource/Android.mk")
}
}
此外,考虑切换到 CMakeLists。它的构建速度要快得多。
Edit : 破解 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
.
将输出重定向到文件
这些是源文件和包含目录,在您的主要 CMakeList 所在的项目的名为 '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})
然后,在您的主 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
...
)
在 Gradle 文件中,在 defaultConfig
内部:
sourceSets{
main {
// let gradle pack the shared library into apk
jniLibs.srcDirs += '../../libusb/lib/'
}
}
在 Android Studio 2.3.2 中生成支持 NDK 的新项目时,您不会再在 jni/
目录中自动生成 Android.mk
文件。
您现在在 cpp/
目录中得到一个 CMakeLists.txt
。
没有 jni/
目录了。
如果您仍然希望使用带有 ndk-build
而不是 CMake
的 Android.mk
文件,该文件放在哪里?
是否应该在 cpp/
目录中创建?
或者它是否进入与 CMakeLists.txt
相同的 app/
目录?
如果您打算 Android Studio 自动构建本机共享库而不是 [=73],则创建 Android.mk
文件时是否必须删除 CMakeLists.txt
文件=] ndk-build
明确?
更新 - 链接到第 3 方库:
我生成了一堆 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 不会对链接器错误有任何影响吧?
在您的 build.gradle 文件(应用程序)中添加 externalNativeBuild
outside of the defaultConfig
and buildTypes
with a path
指向 Android.mk 文件。
externalNativeBuild {
ndkBuild {
path file("../../gameSource/Android.mk")
}
}
此外,考虑切换到 CMakeLists。它的构建速度要快得多。
Edit : 破解 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
.
这些是源文件和包含目录,在您的主要 CMakeList 所在的项目的名为 '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})
然后,在您的主 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
...
)
在 Gradle 文件中,在 defaultConfig
内部:
sourceSets{
main {
// let gradle pack the shared library into apk
jniLibs.srcDirs += '../../libusb/lib/'
}
}