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 而不是 CMakeAndroid.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/'
        }
    }