Android ND 2.3.2中的Android NDK Android.mk位置

时间:2017-06-02 22:00:40

标签: android android-ndk android-studio-2.3

在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对链接器错误没有任何影响吗?

1 个答案:

答案 0 :(得分:1)

在您的build.gradle文件(应用)中,添加externalNativeBuild的{​​{1}} defaultConfig buildTypespath到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/'
        }
    }