2

私はインターネットと StackOverflow を精査しようとしましたが (記事が多すぎて数えきれません)、これらすべての支援を見つけることができません:

  1. 2013年より最近
  2. Windows で開発する場合、Cygwin は必要ありません
  3. Eclipse ではなく、Android Studio を対象としています。

私は初めて Android 開発に真っ先に飛び込みます。私が新しく参加したプロジェクトは、NDK での開発に依存しています。NDK に付属のドキュメントを読んでいますが、このサンプルでは石の壁にぶつかりました。

hello-jniNDK 内のサンプル プロジェクトをビルドしようとしています。ここに私の環境があります:

  • Android Studio 1.4 (現在入手可能な最新の安定版)
  • NDK バージョン: r10e
  • OS: Windows7

Application.mk ファイルの内容:

APP_ABI := all64 // Came with 'all', read somewhere on SO that it 
                 // should be 'all64'. Result is the same.

Android.mk ファイルの内容:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := hello-jni
LOCAL_SRC_FILES := hello-jni.c

include $(BUILD_SHARED_LIBRARY)

私の PATH 環境変数には、私の NDK ルート フォルダーへのパスと\prebuilt\windows-x86_64\bin(必要な多くの記事の 1 つを読んだため) へのパスが含まれています。hello-jni ルート フォルダーに移動して ndk-build を呼び出すと、表示されるだけです。エラーあり。

c:\NDK\android-ndk-r10e\build\core\build-local.mk:40: c:/NDK/android-ndk-r10e/build/core/build/core/init.mk: No such file or directory
c:\NDK\android-ndk-r10e\build\core\build-local.mk:191: \add-application.mk: No such file or directory
c:\NDK\android-ndk-r10e\build\core\build-local.mk:206: \setup-imports.mk: No such file or directory
c:\NDK\android-ndk-r10e\build\core\build-local.mk:223: \build-all.mk: No such file or directory
make.exe: *** No rule to make target `\build-all.mk'.  Stop.

人々が私を支援するために他に何か必要な場合は、私ができることを提供しますという言葉を言ってください. すべてのヘルプは大歓迎です。

編集: Windows について私が見た記事のほとんどは Cygwin について言及していますが、ドキュメントによると、それは必要ありません。これが間違っている場合は、修正してください。

を除いて\android-ndk-r10e\docs\Programmers_Guide\html\md_3__key__topics__building__s_t_a_n_d_a_l_o_n_e-_t_o_o_l_c_h_a_i_n.html

Windows のサポート

Windows バイナリは Cygwin に依存しません。良いニュースは、このように高速であることです。悪いニュースは、/cygdrive/c/foo/bar (C:/foo/bar ではなく) のような Cygwin パス仕様を理解していないことです。

NDK ビルド システムは、Cygwin からコンパイラに渡されるすべてのパスが自動的に変換されることを保証し、他の恐怖を処理します。カスタム ビルド システムを使用している場合は、自分で問題に対処する必要がある場合があります。

4

2 に答える 2

2

私はこの回答の功績を認めることはできません.同僚が親切に私のためにそれを調べてくれました. 彼が答えを見つけたとき、私は彼が他に何をしたかを知りたがった。私は彼がmakeファイルで2行を切り替えるのを見ただけで、もっとあるはずですか?ああ、いいえ。これだけが私の苦しみの元でした。

Cygwin でどのように動作するかがわからないため、NDK 内のエラーと呼ぶのをためらっていますが、参照する行は2011 年または 2010 年に追加されたものとして git リポジトリに記録されています。 ( https://android.googlesource.com/platform/ndk/+/master/build/core/build-local.mk )

説明を助けるために、ここに私のエラーの最初の行をもう一度示します。

c:\NDK\android-ndk-r10e\build\core\build-local.mk:40: c:/NDK/android-ndk-r10e/build/core/build/core/init.mk: No such file or directory

見つからない最初のファイルは です。これは、繰り返してはならない...build/core/build/core/init.mkため、もちろん存在しません。build/core

ビルドを開始するコマンド は、プロセスを開始するためndk-build.cmdに呼び出しbuild\core\build-local.mkます。このファイル内では、入力時に環境変数 NDK_ROOT が再作成されます。私のNDK_ROOT が何であれ、無関係です。

NDK_ROOT := $(dir $(lastword $(MAKEFILE_LIST)))
NDK_ROOT := $(strip $(NDK_ROOT:%build/core/=%))
NDK_ROOT := $(subst \,/,$(NDK_ROOT))
NDK_ROOT := $(NDK_ROOT:%/=%)
.
.
.

build/core/2 行目は、新しい NDK_ROOT の末尾から現在のディレクトリ (the ) の末尾を取り除きます。これは、真のルートが の親ディレクトリである必要があり、build後でそれらの「不足している」ファイルをすべて見つけるために追加されるためです。/検索で使用されるスラッシュ ( ) に注意してください。Windows はスラッシュを使用しません (または、少なくとも私の経験では、通常は返されません)。(たとえば、ディレクトリを変更する場合、どこに移動する必要があるかを既に知っている限り、どちらでも受け入れられることがわかりました。パスが で終わる場合、タブ補完は機能しないようです/。)

ああ、でも 3 行目を見てください (2011 年に追加されました)。\NDK_ROOT 内のすべてのバックスラッシュ ( ) が置換され、スラッシュ ( ) に置き換えられ/ます。の交換はbuild/core/スムーズに進むはずですよね?問題:手遅れです。

strip 呼び出しはすでに発生しており、NDK_ROOT がスラッシュの代わりにバックスラッシュを含むパスを受け取った場合、build/core/決して見つからず、変数から削除されます。私の同僚はどのようにそれを修正しましたか? 簡単。彼は行を次のように切り替えました。

NDK_ROOT := $(dir $(lastword $(MAKEFILE_LIST)))
NDK_ROOT := $(subst \,/,$(NDK_ROOT))
NDK_ROOT := $(strip $(NDK_ROOT:%build/core/=%))
NDK_ROOT := $(NDK_ROOT:%/=%)

私のhello-jniプロジェクトは、NDK からの別のサンプルと共にTeapot、念のため試してみました。native-audionative-codecnative-media、およびも同様More Teapotsです。まだ実行しようとはしていませんが、ビルド エラーはありません。

この修正が Cygwin ユーザーに影響するかどうかはわかりません。私のボックスにはありません。また、Linux がインストールされていないため、Linux 環境が壊れるかどうかもわかりません。しかし、これはネイティブの Windows ユーザーに役立つかもしれません。私はそう願っています。なぜなら、私は 3、4 日間無駄に頭を悩ませ、一度に気にするよりも多くの SO 記事を読んだからです。

于 2015-10-23T22:48:33.830 に答える
1

Windows マシンを使用すると、このエラーが発生しましたが、clear-vars.mk : No such file or directory と表示されました。ディレクトリのndk-build.cmdを見た後

C:\Users\\AppData\Local\Android\Sdk\ndk-bundle\build

ファイルは次のようになります

@echo off
set NDK_ROOT=%~dp0\..
set PREBUILT_PATH=%NDK_ROOT%\prebuilt\windows-x86_64
if exist %PREBUILT_PATH% goto FOUND
set PREBUILT_PATH=%NDK_ROOT%\prebuilt\windows
:FOUND
"%PREBUILT_PATH%\bin\make.exe" -f "%NDK_ROOT%\build\core\build-local.mk" SHELL=cmd %*

ただし、ディレクトリの下にも同じファイル名があります

C:\Users\jmatthews\AppData\Local\Android\Sdk\ndk-bundle

ファイルは次のようになります

@echo off
%~dp0\build\ndk-build.cmd %*

2行目を削除して、エコーを1行だけオフにしてこのように表示します

@echo off

このファイルが呼び出され、Windows のディレクトリ構造がめちゃくちゃになります。その後、Windowsでコンパイルできました。また、ディレクトリ内のスペースを使用するプロジェクトで問題が発生したため、プロジェクトの場所をスペースのないディレクトリに移動してください。

于 2019-07-31T16:31:07.350 に答える