1

現在、ネイティブ コードと Java コードの両方からアクセスできるようにする必要があるカスタム ロギング メカニズムを実装しています。ロギングの基本は、Java ラッパーを使用して C/C++ で実装されており、2 つを合わせて Android ライブラリ プロジェクトとして構築されています。

当面の問題は、私の Java コードはライブラリ プロジェクトの出力にアクセスできますが、ネイティブ コードがライブラリ プロジェクトのネイティブ .so またはヘッダーにアクセスする方法がないように思われることです。見逃している追加の手順はありますか、それとも現在の ADT の単なる制限ですか? より具体的には、一般的にライブラリ プロジェクトから抜け出すことに慣れているものに対処する makefile/eclipse 構成はありますか? (必要に応じて .so をビルドし、再ビルドされた .so をインポートし、c/c++ コンパイルに関連するヘッダーをインポートするなど)

4

2 に答える 2

1

I don't think it's a limitation. We are supposed to declare native code dependencies in Android.mk and Application.mk

于 2012-09-05T20:21:40.753 に答える
0

私が欲しいものを手に入れる方法を考え出しました-ほとんどの情報は(もちろん)NDKドキュメントにありますが、私がやろうとしていたことはADT内で100%サポートされていません。また、私は現在Windows環境での開発に追われているため、Linuxではこれの多くが簡単または不要になる可能性があることにも注意してください。最初のキーは$(call import-module ...)マクロです。ライブラリプロジェクト内で、ソースファイルとAndroid.mkフォルダーを後で見つけることができる名前付きディレクトリに移動します。私のライブラリプロジェクトディレクトリは次のようになりました。

MyProject
  > src
  > res
  v jni
      - Application.mk
      v MyLib
          - source.cpp
          - source.h
          - Android.mk

また、プロジェクトを指すようにApplication.mkを編集する必要がありました。

APP_PROJECT_PATH := <path-to-my-project>
APP_BUILD_SCRIPT := $(APP_PROJECT_PATH)/jni/MyProject/Android.mk

./厄介なことに、これは、ソースファイルにを追加するまで、予期しない方法でAndroid.mkを壊しました。また、リンクのためにインクルードをエクスポートする必要があります。

LOCAL_SRC_FILES := ./source.cpp
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)

システムパス変数NDK_MODULE_PATHがライブラリのJNIディレクトリを含むように設定されていることを確認します<path-to-my-project>/jni(注:これを行った後、Eclipseを再起動する必要がありました)。

受信側のアプリケーションのAndroid.mkファイル(アプリにネイティブにリンクするファイル)で、モジュールをインポートします。

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := MyNativeProject
LOCAL_SRC_FILES := source.cpp
LOCAL_CFLAGS := -DANDROID_NDK -g -std=c99
LOCAL_SHARED_LIBRARIES := MyLib
include $(BUILD_SHARED_LIBRARY)

$(call import-module,android/native_app_glue)
$(call import-module, IntelLog)

この時点ですべてが完全に構築されましたが、APKパッケージャーは生成された.soバイナリが2回含まれることを好みませんでした(1回はLibraryプロジェクトの自然なインポートプロセスから、もう1回はimport-module呼び出しから)。これを解決するには、ライブラリをクリーンアップし、再度ビルドしないでください。呼び出しによってimport-module.soがビルドされ、プロジェクトにインポートされます。(明らかに、プロジェクトでJava APIのみが必要な場合は、その.soファイルをビルドする必要があります)。おめでとう!ハイブリッドネイティブ/Javaライブラリを使用した機能的な(単純ではないにしても)ビルドプロセスがあります

于 2012-09-06T22:45:05.503 に答える