2017-06-02 15 views
1

Androidスタジオ2.3.2でNDKをサポートする新しいプロジェクトを生成すると、jni/ディレクトリに自動生成されたAndroid.mkファイルが取得されなくなりました。Androidスタジオ2.3.2のAndroid NDK Android.mkの場所

cpp/ディレクトリにCMakeLists.txtが追加されました。

jni/ディレクトリはありません。

CMakeではなく、のファイルをAndroid.mkとしたい場合は、どこにファイルがありますか?

cpp/ dirに作成する必要がありますか?

app/CMakeLists.txtと同じですか?

Androidのメーカーではなく、明示的にndk-buildを実行するよりもネイティブ共有ライブラリを自動構築するためにあなたが予定の場合は、Android.mkファイルを作成する場合は、CMakeLists.txtファイルを削除する必要がありますか?

アップデート - サードパーティのLIBSへのリンク:

~/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 

私は、例えばMIPS64 /のすなわち

~/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 

内容がどのように見える、のlibusbの.soファイルの束を生成しました

つまり、クロスビルドの.soファイルがそこにあります。

CMakeLists.txtで私のlink_d

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) 

しかし、私はエラーがリンクになっています:link_directoriesが選ん取得されていないかのように

~/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 

そのをirectoriesは次のようになります$ {ANDROID_ABI}は機能していませんか?

build.gradleファイルのmodは、リンカーエラーの影響を受けません。あなたのbuild.gradleファイル(アプリ)で

答えて

1

はAndroid.mkファイルを指すpathdefaultConfigbuildTypesの外externalNativeBuildを追加します。

externalNativeBuild { 
    ndkBuild { 
     path file("../../gameSource/Android.mk") 
    } 
} 

また、CMakeListsへの切り替えを検討してください。それははるかに速く構築されます。


編集:あなたはNDK-構築、実行時に代わりにライブラリを構築するファイルのリストを出力するようにAndroid.mkをハック。

$(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}) 

はその後、自分のメインCMakeListsで、 'libusbを' ディレクトリが含ま:

######################################################### 
# import libusb library 
######################################################### 
add_subdirectory(libusb) 

をそして、我々はあなたのtarget_link_librariesに以前の設定ライブラリの名前を追加します。


編集:CMakeListsに構築済み.soを追加します。

defaultConfigの内部のGradleファイルで
include_directories(../../libusb/include ...) 
link_directories(
    ../../libusb/lib/${ANDROID_ABI}/ 
    ... 
) 

target_link_libraries(
         usb 
         ... 
) 

、:

sourceSets{ 
     main { 
      // let gradle pack the shared library into apk 
      jniLibs.srcDirs += '../../libusb/lib/' 
     } 
    } 
+0

私はすでにCMakeのパスをダウンしていたが、その後、ビルドのlibusbを横断しようとして捕まってしまいました。 libusbのtarballのアンドロイドのヘルプは.mkベースです。 CMakelists.txtから.mkファイルを呼び出せますか? – bph

+1

いいえ、私が過去に行ったことは、Android.mkファイルをハッキングしてファイルリストを生成して、 'LOCAL_SRC_FILES'ファイルと' LOCAL_C_INCLUDES'ファイルを吐き出すことです。私は簡単なデモのために私の答えを編集します。 –

+0

私は提供された.mkファイルを使用してlibusb libをクロスビルドすることができたことを念頭に置いておいてください。私のプロジェクトCMakeLists.txtに.soファイルの場所を指定して、 .apk?言い換えれば、私は一度にビルドする必要はないかもしれませんが、私はプロジェクトとは別にlibusbを構築してから、私のプロジェクトがlibとlibの場所を必要としていることを確認していますか? – bph

関連する問題