Android NDKはプリコンパイルされたダイナミックリンクライブラリを参照

2422 ワード

NDKにはandroid-ndk-r 10/samples/module-exports/jniという例があります
———————————————————————————–
r 5バージョンから、プリコンパイルされたライブラリ(共有と静的)がサポートされる.つまり、あなたのアプリケーションには、事前にコンパイルされたライブラリが含まれ、使用できます.
この機能の使い道自分のライブラリを第三者NDK開発者に配布したいのですが、ソースコードを渡したくないです.自分のプリコンパイルされたライブラリを使用して、プロジェクトのBuildプロセスを加速したいと思っています.
プリコンパイルされたライブラリモジュールを宣言する各プリコンパイルされたライブラリは、ndk buildシステムに独立したモジュールとして宣言する必要があります.
ディレクトリ構造
mylib

   --Android.mk

   --libfoo.so


Android.mkの内容
LOCAL_PATH := $(call my-dir)



include $(CLEAR_VARS)

LOCAL_MODULE := foo-prebuilt

LOCAL_SRC_FILES := libfoo.so

include $(PREBUILT_SHARED_LIBRARY)


注意事項1.各プリコンパイルされたモジュールには、foo-prebuiltモジュールの名前がプリコンパイルされたライブラリの名前とは異なる(例えば、ライブラリの名前はlibfoo、モジュールの名前はfoo-prebuild)2という名前が必要である.LOCAL_の設定SRC_FILESが提供するプリコンパイルライブラリのパス.なお、このパスはLOCAL_に対してPATHの.LOCALにもあるそうですPATH/libディレクトリでソースを探します.
また、提供されているライブラリにABIのバージョンが複数ある場合は、後で説明します.
3.PREBUILTを含むSHARED_LIBRARY(共有ライブラリを提供する);またはPREBUILTを含むSTATIC_LIBRARY(静的ライブラリの提供)
上記のプリコンパイルモジュールを他のモジュールで参照するにはLOCAL_を追加します.SHARED_LIBRARIES(またはLOCAL_STATIC_LIBRARIES)はあなたのAndroid.mkに宣言すればいいです.
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)



LOCAL_MODULE := foo-user

LOCAL_SRC_FILES := foo-user.c

LOCAL_SHARED_LIBRARIES := foo-prebuilt

#LOCAL_LDLIBS := -lm -llog



include $(BUILD_EXECUTABLE)


唯一注意すべきは、ライブラリ名(libfoo)ではなくモジュール名(foo-prebuilt)を参照することです.
プリコンパイルされたライブラリ出力ヘッダファイルの実際の応用においてfoo-user.cは、ライブラリファイルとともに配布されるヘッダファイル(foo.h)で宣言する関数または変数、すなわちfoo-user.に依存する.cには次のコードがあります.
#include <foo.h>


foo-userモジュールを構築する場合は、プリコンパイルモジュールのヘッダファイルとヘッダファイルの含むパスをコンパイラに提供する必要があります.
ヘッダファイルがプリコンパイルモジュールディレクトリの下にあるincludeディレクトリを愛していると仮定すると、プリコンパイルモジュールのAndroid.mkでexportを使用する
LOCAL_PATH := $(call my-dir)



include $(CLEAR_VARS)



LOCAL_MODULE := foo-prebuilt

LOCAL_SRC_FILES := libfoo.so

LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include



include $(PREBUILT_SHARED_LIBRARY)


LOCAL_EXPORT_C_INCLUDESは、別のリファレンスモジュールに適切なヘッダファイルの別のリファレンスモジュールを見つけることができ、自分のAndroid.mkでLOCAL_C_INCLUDEが探しに来た(これを宣言する必要はないようで、LOCAL_LDFLAGSも使わない)
複数種類ABI
armeabi     CPU ARM v5 TE       

armeabi-v7a   CPU  ARM v7       

x86      

mips


プリコンパイルモジュールで定義されているLOCAL_を変更する必要があります.SRC_FILES
 LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libfoo.so