38

注: どうやら StackOverflow に関する繰り返しの質問ですが、私が見た限りでは、人々が方法を見つけられないか、解決策がうまくいかないかのどちらかです。

問題:

Eclipse Juno ADT を使用しています。NDK を更新しようとするまで、すべてが正常に機能していました。ndkフォルダー (つまり ) をndk-r8d新しいバージョン (つまりndk-r8e)に置き換え、Paths and Symbols構成でインクルードを g++ 4.6 から 4.7 に変更しました。

インデックスが壊れているように見えました。コードをコンパイルできましたが、[ 1 ] や [ 2 ] とまったく同じように、Eclipse がセマンティック エラーを出していました。エラーはdistanceに、pt、、 などの OpenCV4Android で使用される記号から発生queryIdxtrainIdxます。

古い構成にバックアップしようとすると、インデックスがまだ壊れていました! これを変更する方法が見つかりません。


私が試したこと

  • プロジェクトをクリーンアップする
  • 「インデックス」サブメニューの再構築、更新、およびその他すべてのオプション (プロジェクトを「右クリック」した場合)
  • 環境設定でインデクサーを無効/有効にする
  • trainIdxOpenCV4Android にのみ表示されるなどの記号がPaths and Symbolsセクションに含まれていることを確認します。
  • セクション内のインクルードの順序を変更しPaths and Symbolsます。私は基本的にOpenCVのインクルードを最初と最後に入れようとしました。

いくつかの観察

機能していないもの

次の理由から、 CDT インデックスであると思います。

  • ndk-build cleanコマンド ラインでは、 と を使用してプロジェクトをビルドできndk-buildます。
  • jniEclipse を起動すると、(フォルダーから) C++ ファイルを開くまでエラーは発生しません。
  • プロジェクトはいつでもビルドできますが、C++ ファイルを開いている限り、多くの理由でアプリケーションを実行できません。Field '<name>' could not be resolved.
  • C++ ファイルを開かない場合、Eclipse はエラーを報告せず、Android アプリケーションを正常にビルドおよびデプロイできます。

興味深い事実

line次のコードは、、、queryIdxでエラーを報告しますpt:

cv::line(mRgb, keypointsA[matches[i].queryIdx].pt, keypointsB[matches[i].trainIdx].pt, cv::Scalar(255, 0, 0, 255), 1, 8, 0);

次のように書くと、うまくいきます。

cv::DMatch tmpMatch = matches[i];
cv::KeyPoint queryKp = keypointsA[tmpMatch.queryIdx];
cv::KeyPoint trainKp = keypointsB[tmpMatch.trainIdx];
cv::line(mRgb, queryKp.pt, trainKp.pt, cv::Scalar(255, 0, 0, 255), 1, 8, 0);

すべての OpenCV 関数が未解決というわけではありptませqueryIdxtrainIdx

どんなコメントでも本当に感謝します。

4

8 に答える 8

33

Eclipse 環境内で選択したプロジェクト設定で、C/C++ General -> Code Analysis -> Launching に移動します。両方のチェック ボックスがオフになっていることを確認します。プロジェクトを閉じて再度開くか、Eclipse を再起動してプロジェクトを再構築します。

于 2013-06-03T07:14:33.437 に答える
10

Eclipse での Android ネイティブ コードのインデックス作成は不完全であるため、次の非直感的な方法で NDK プロジェクトでインデックス作成を有効にすることができndk-buildましmakecmake。私は Kepler を使用していますが、古いバージョンでも動作するはずです。

ツールチェーンを正しくする

  • プロジェクトを右クリック -> Properties-> C/C++ Build-> Tool Chain Editor-> チェックを外しますDisplay compatible toolchains only
  • 同じウィンドウで、 に設定Current toolchainLinux GCCます。
  • 同じウィンドウで、を使用している場合はに設定し、そうでない場合は に設定しCurrent builderます(この手順は間違っている可能性があります。間違っている場合は事前に申し訳ありません)。Android Builderndk-buildGnu Make Builder
  • プロジェクトを右クリック -> Properties-> C/C++ Build-> ->プロジェクトの正しいコマンドを読み取るBuild Variablesことを確認してください。Build commandそうでない場合は、チェックUse default build commandを外して修正します(そうであるndk-buildmake -j5、必要な場合があります)。別のターミナルでネイティブ コードをビルドする場合は、この手順を省略できます。

スタンドアロンのツールチェーンを作成します。おそらく、STL ソースを 1 か所で取得する最もクリーンな方法です

  • NDK ルート ディレクトリに移動します。
  • 以下を実行します (好みに応じて設定を微調整してください)。スクリプトがサイレント モードで失敗するため、sudoへの書き込み権限がない場合は追加します。--install-dir

        ./build/tools/make-standalone-toolchain.sh \
            --platform=android-14 \
            --install-dir=/opt/android-toolchain \
            --toolchain=arm-linux-androideabi-4.8
    
  • これは、GNU-STL を使用していることを前提としています。別の C/C++ ライブラリを使用する場合は、上記のコマンドを調整する必要があり、おそらく次のコマンドのインクルード パスも調整する必要があります。

プロジェクトに必要なインクルード パスを追加します。

  • プロジェクトを右クリック -> Properties-> C/C++ General-> ->タブPaths and Symbolsに移動->から選択-> クリックして次のパスを追加します (スタンドアロン ツールチェーンを にインストールしたと仮定します)。IncludesGNU C++LanguagesAdd/opt/android-toolchain

    • /opt/android-toolchain/include/
    • /opt/android-toolchain/include/c++/4.8/
    • /opt/android-toolchain/include/c++/4.8/arm-linux-androideabi/
    • /opt/android-toolchain/lib/gcc/arm-linux-androideabi/4.8/include/
    • /opt/android-toolchain/include/c++/4.8/backward/
    • /opt/android-toolchain/lib/gcc/arm-linux-androideabi/4.8/include-fixed/
    • /opt/android-toolchain/sysroot/usr/include/
  • ここで、必要なすべてのインクルード パスを追加できます。実際、私は OpenCV を Android 用にビルドし、スタンドアロン ツールチェーンにインストールしているので、そこに次のものが含まれています。

    • /opt/android-toolchain/sysroot/usr/share/opencv/sdk/native/jni/include/

これで、インデックス作成が機能するはずです。ndk-buildまた、プロジェクトを実行して(またはmakeそれがビルド方法である場合)、プロジェクトを Eclipse 内のデバイスにデプロイできるはずです。

なんで?

インデックス作成はそのままでは機能しないため、Eclipse での Android ネイティブ開発は不完全です。これは、複数のアーキテクチャ (ARMv7、Intel など)、複数の STL オプション、複数の Android バージョンなどをサポートする必要があるためです。これが、裸のmakeベースndk-buildと全体の NDK 構造を持つ理由であり、NDK 開発が非常に汚れている理由でもあります。大規模なネイティブ Android プロジェクトはほとんどありません。

大規模な Android プロジェクトは OpenCV であり、Android 用に適切にコンパイルするには、1500 行の CMake スクリプトを開発する必要がありました。ある時点で、彼らはそのスクリプトを Android 用の CMake ベースのビルド システムとしてエクスポートしようとしましたが、NDK システムの変更に追いつくことができず、放棄されました。このサポートは、NDK 自体の内部にあるはずです。

デフォルトの NDK ビルド システムは、ストレージ スペースを犠牲にして独自のツールチェーンを持つすべての異なるアーキテクチャ/C++ ライブラリを備えたスタンドアロン ツールチェーンのみである必要がありますが、クリーンさ、直感性、優れたプラクティスという利点があります。次に、CMake など、他の場所でも使用され、テストされ、よく知られている標準的なクロスコンパイル システムを組み込むことができます。make-standalone-toolchain上記のように、NDK のコマンドを使用してそれを行うことができます。しかし、これはあくまで私の意見です。十分に快適に感じたらndk-build、先に進んでください。

于 2014-04-08T11:19:16.433 に答える
6

何が問題なのかを言うのは実際にはかなり難しいです。ここにいくつかのアドバイスがあります:

  1. インポートしてビルドしてみてくださいhello-jni(jnisamplesフォルダにあります)。問題なく実行される場合は、OpenCV をプロジェクトにリンクすることに問題があります。
  2. android-ndkで場所を更新するのを忘れたようですproject properties -> c/c++ build -> environment問題Issue with build Android NDK projectへのリンクは次のとおりです。
  3. コンソールからプロジェクトをビルドし ( ndk-build -B)、Eclipse のすべてのエラーを手動で削除し (Problemsビューですべてのエラーを選択して をクリックするだけdelete)、今すぐプロジェクトを実行してみます。時々、この「ハック」がプロジェクトの実行に役立ちます。
  4. Eclipse を閉じてフォルダーを削除しますpath-to-your-workspace/.metadata/.plugins/org.eclipse.cdt.core(最初にバックアップします)。
于 2013-06-02T10:28:03.537 に答える
0

同じ問題がありました。すべての適切なインクルード パスをセットアップしましたが、.c/.cpp または .h ファイルを開くと、すべてが「未解決」としてマークされ始めます。
これは私にとってはうまくいきました... PREFERENCES -> C/C++ -> INDEXER Check Index Source And Header Files Open in Editor に
移動 します。

于 2014-10-21T06:02:15.853 に答える
0

[設定] > [C/C++] > [言語マッピング] > [ADD (ソース C ファイル)] に移動し、[GNU C] を選択します) C++ についても同じことを行います。

于 2014-01-05T21:32:27.210 に答える
0

OpenCV ライブラリを使用する Eclipse CDT と同様の状況がありました。プログラムが正しくコンパイルされている間に、いくつかのエラー メッセージが表示されました。「ウィンドウ->設定->インデクサー」「インデクサーのビルド構成」ボックスのインデクサー設定を「アクティブ構成を使用」に変更して、問題を解決しました。

于 2015-09-26T02:44:32.027 に答える
0

多くの人と同じように、私も同じ問題を抱えていました。

Ayberk Özgür の投稿の手順に従いましたが、これは理にかなっています。また、GNU C、GNU C++、およびアセンブリの 3 つの言語すべてにインクルードを配置する必要もありました。おそらく、スタンドアロンのツール チェーンを使用していないためです。

私は最初、GNU C および GNU C++ 言語でしかインクルードしていませんでした。まだ未解決のインクルードエラーが残っています。アセンブラー言語でインクルードを割り当てるまで、エラーはなくなりませんでした。

プロジェクトに含まれるアセンブラーのみを Eclipse が検索する理由がわかりません。また、ソリューションのこの部分が、より大規模で複雑なプロジェクトでどのように機能するかもわかりません。

お役に立てれば。

于 2015-02-22T19:30:20.083 に答える