4

自分のライブラリをAndroidNDKでコンパイルしようとしていますが、いくつか問題があります。

これが私のAndroid.mkファイルです:

# Define vars for library that will be build statically.
include $(CLEAR_VARS)
LOCAL_MODULE     := MyLib
LOCAL_SRC_FILES  := ../../../src/mylib/utils/Timer.cpp
LOCAL_C_INCLUDES := ../../../src/mylib/

# Optional compiler flags.
LOCAL_LDLIBS     = -lz -lm
LOCAL_LDLIBS    := -llog  
LOCAL_CPPFLAGS  := -std=c++0x

include $(BUILD_SHARED_LIBRARY)

「ndk-build」を使用してプロジェクトをビルドすると、次のエラーが発生します。

Clean: mylib [armeabi]
Clean: stlport_shared [armeabi]
Clean: stlport_static [armeabi]
Compile++ thumb  : mylib <= Timer.cpp
jni/../../../src/mylib/utils/Timer.cpp:1:34: fatal error: mylib/utils/Timer.hpp: No such file or directory
compilation terminated.

参考までに、私はそのような.hppを含めています:

#include <mylib/utils/Timer.hpp>

ヘッダーが見つからない理由がわかりません。私のライブラリはXcodeとeclipseで動作しています。御時間ありがとうございます!

編集:これが私の問題を理解するための私のプロジェクトのアーキテクチャです:http://i.imgur.com/aiah6zH.jpgAndroid.mk ファイルのどこに私の「.hpp」ファイルがあるかを示しようとしています。

4

2 に答える 2

5

LOCAL_C_INCLUDES には、使用するために../../../src/またはディレクトリを含める必要があります。../../../inc#include <mylib/utils/Timer.hpp>

LOCAL_C_INCLUDES := ../../../src/

C および C++ ヘッダーとソース ファイルを、Android プロジェクトの jni/ ディレクトリ内 (Android.mk ファイルの近く) に配置してみませんか?

参照: #include <ファイル名> と #include "ファイル名" の違いは何ですか?

また、2 番目の LOCAL_LDLIBS が現在のモジュールの前の LOCAL_LDLIBS ディレクティブをオーバーライドするため、これも正しくありません。

LOCAL_LDLIBS     = -lz -lm
LOCAL_LDLIBS    := -llog  

make ディレクティブに追加する場合は、次を使用します。

LOCAL_LDLIBS    := -lz -lm
LOCAL_LDLIBS    += -llog 

またLOCAL_LDLIBS := -lz -lm -llog

編集: Android/jni ディレクトリから ndk-build を実行すると、次の Android.mk を使用して動作するようです。

LOCAL_PATH := $(call my-dir)

# first lib, which will be built statically
#
include $(CLEAR_VARS)
LOCAL_MODULE     := MyLib
LOCAL_C_INCLUDES := ../../../inc/
LOCAL_SRC_FILES  := ../../../src/mylib/utils/Timer.cpp
include $(BUILD_STATIC_LIBRARY)

# second lib, which will depend on and include the first one
#
include $(CLEAR_VARS)
LOCAL_MODULE    := MyNativeFinalSharedLib
LOCAL_LDLIBS    := -lz -lm -llog  
LOCAL_CPPFLAGS  := -std=c++0x
LOCAL_STATIC_LIBRARIES := MyLib   
include $(BUILD_SHARED_LIBRARY)

また、最初の行に LOCAL_PATH := (call my-dir) を入れるのを忘れており、その他の欠落している make ディレクティブもいくつかあります。

Android.mk ファイルは、LOCAL_PATH 変数の定義で始まる必要があります。開発ツリーでソース ファイルを検索するために使用されます。この例では、ビルド システムによって提供されるマクロ関数 'my-dir' を使用して、現在のディレクトリ (つまり、Android.mk ファイル自体を含むディレクトリ) のパスを返します。

(android-ndk-r8d/docs/ANDROID-MK.html より)

于 2013-01-25T15:14:07.117 に答える
0

Android.mkファイルを定義することを強くお勧めします$(LOCAL_PATH)。あなたの場合、最良の選択はおそらく

LOCAL_PATH := $(call my-dir)/../../../../src

これで、簡単に書くことができます

LOCAL_SRC_FILES  := mylib/utils/Timer.cpp

ただし、インクルードの場合、パスは現在のディレクトリ、つまりディレクトリからの相対パスとして定義する必要がありますMyProject/build/Android。あなたの場合、正しいパスは次のようになります

LOCAL_C_INCLUDES := ../../../inc

mylibこれは、#includeステートメントで指定する場合:

#include <mylib/utils/Timer.hpp>
于 2013-01-25T21:20:53.423 に答える