7

ライブラリをAndroidNDKビルドに含めるのに行き詰まっています。

ライブラリは正しくコンパイルされ、ダミーのcppファイルを作成し、シェルで直接g++コマンドを使用してすべてをビルドするときに正常に機能します。

現在のAndroid.mkファイルは機能せず、対応するヘッダーファイル(.aファイルの一部)が見つからないというエラーがスローされます。

ビルド済みの静的ライブラリを正しく含めるにはどうすればよいですか?

私のAndroid.mkファイルは次のようになります。

LOCAL_PATH := $(call my-dir)


# V8 Base

include $(CLEAR_VARS)

LOCAL_MODULE          := v8_base
LOCAL_MODULE_FILENAME := v8_base_static
LOCAL_SRC_FILES := ../lib/libv8_base.a

include $(PREBUILT_STATIC_LIBRARY)


# V8 Nosnapshot

include $(CLEAR_VARS)

LOCAL_MODULE          := v8_nosnapshot
LOCAL_MODULE_FILENAME := v8_nosnapshot_static
LOCAL_SRC_FILES := ../lib/libv8_nosnapshot.a

include $(PREBUILT_STATIC_LIBRARY)


# V8GL Runtime

include $(CLEAR_VARS)

LOCAL_MODULE    := v8gl-runtime
LOCAL_SRC_FILES := main.c ../src/v8gl/v8gl.cpp
LOCAL_CPPFLAGS  := -D__ANDROID__
LOCAL_LDLIBS    := -llog -landroid -lEGL -lGLESv1_CM
LOCAL_STATIC_LIBRARIES := android_native_app_glue v8_base v8_nosnapshot

# LOCAL_EXPORT_CPPFLAGS := -D__ANDROID__

include $(BUILD_SHARED_LIBRARY)

$(call import-module,android/native_app_glue)

コンパイラの出力は次のとおりです。これは理にかなっていますが、単一の.aファイルが含まれていないことを示しているだけで、理由はわかりません。

Compile++ thumb  : v8gl-runtime <= v8gl.cpp
(... g++ call)
In file included from jni/../src/v8gl/v8gl.cpp:6:
jni/../src/v8gl/v8gl.h:5:16: error: v8.h: No such file or directory

絶対パスを使用したソリューション

@ alex-cohnのヒントのおかげで、インクルードが誤って指摘されていることがわかりました。そこで、絶対パスを含むndk-buildを呼び出す前に設定された環境変数を使用することにしました。これで、インクルードの問題が修正されます。

したがって、実際の包含が行われる最後のモジュールは、次のようになります。

ADK_PATH=/var/whatever/to/your/project/root_not_jni

include $(CLEAR_VARS)
LOCAL_MODULE    := v8gl-runtime
LOCAL_SRC_FILES := main.c ../src/v8gl/v8gl.cpp

LOCAL_C_INCLUDES:= $(ADK_PATH)/external/v8/include

LOCAL_CPPFLAGS  := -D__ANDROID__
LOCAL_LDLIBS    := -llog -landroid -lEGL -lGLESv1_CM
LOCAL_STATIC_LIBRARIES := android_native_app_glue v8_base v8_nosnapshot

また、ライブラリが後でコンパイルされるため、何らかの理由でライブラリが含まれていることも示されています。

相対パスを使用したソリューション

すべてのインクルードパスは、 jniフォルダーではなく、プロジェクトのルートフォルダーを基準にしています。それはそれがコンパイラとして着陸することを意味します-私はこのようなものとしてフラグを立てます:

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../file_in_project.root

# resulting g++ flag:
-Ijni/../file_in_project.root

したがって、相対インクルードパスとjniフォルダーに相対的なLOCAL_SRC_FILESには違いがあります。

4

1 に答える 1

5

あなたはおそらくv8.hディレクトリ../includeか他のどこかにファイルを持っています...

行を追加する必要があります

LOCAL_C_INCLUDES = $(LOCAL_PATH)/../include

LOCAL_SRC_FILES必要のない場所とは異なり、ここでは、必要なファイルが$(LOCAL_PATH)あるすべてのディレクトリのフルパスを配置する必要があることに注意してください。.h

于 2012-09-12T06:28:00.497 に答える