ndkでコンパイルされた実行可能ファイルをsoに偽装してapkにパッケージする方法
2373 ワード
ndkでコンパイルされた共有ライブラリでは、eclipseは自動的にapkにパッケージされますが、コンパイルされた実行可能ファイルでは実行できません.
実行可能ファイルをapkに自動的にパッケージするには、ファイル名をlibxxxに変更することができます.soの形式は、soに偽装され、apkにパッケージされます.
でもコンパイルするたびに名前を変えるのは面倒!
スクリプトを書きましょう.arm、armv 7、x 86の面倒なこともあります.
LOCALを変えてみたいMODULE_FILENAMEがやってみよう、NDKは許さない.
そこでNDKのコンパイルスクリプトを少し見て、次のような解決策を発見しました.
NDKはAndroidでmkファイルのinclude$(BUILD_EXECUTABLE)は実行可能なファイルをコンパイルするために、実際にはすでに書かれたスクリプトであるbuild-executableを呼び出した.mk.(コンパイルスクリプトはすべてNDK_ROOT/build/coreディレクトリにあります)
スクリプトの呼び出しプロセスをよく見ると、スクリプトは最初に変数の正当性をチェックし(前にLOCAL_MODULE_FILENAMEを変更する方法はここでは通れない)、最終的にinclude$(BUILD_SYSTEM)/build-moduleを呼び出す.mkでコンパイルします.
そこでこのスクリプトを検討し,コンパイル出力を決定する変数を見つけ,最終的なコンパイルスクリプトを呼び出す前に所望のものに変更すればよい.
最終的に私の案は以下の通りです.
1.ndk本来のスクリプトを破壊しないようにbuild-executable.mkコピーは自分のプロジェクトディレクトリの下に置いて、最後から3行目に$(evalLOCAL_BUILT_MODULE:=$(TARGET_OUT)/$(MY_LOCAL_MODULE_FILENAME))を挿入します.
2.自分のAndroid.mkファイルで定義MY_LOCAL_MODULE_FILENAME変数、もちろん値はあなたが望むファイル名です.
3.コンパイル時にシステムのinclude$(BUILD_EXECUTABLE)を呼び出さず、自分のスクリプト(上にコピーして修正したスクリプト)を呼び出すように変更します.便宜上、自分のスクリプトに変数を定義して指向することができます.
そうです.
書き方が乱れているので、いくつかのキーコードを貼りましょう.
修正後のbuild-executable.mkコード.
上のファイルはjniルートディレクトリと、ディレクトリの下のAndroidに置いてあります.mkコード:
実行可能ファイルをコンパイルするモジュールは、次のように書きます.
実行可能ファイルをapkに自動的にパッケージするには、ファイル名をlibxxxに変更することができます.soの形式は、soに偽装され、apkにパッケージされます.
でもコンパイルするたびに名前を変えるのは面倒!
スクリプトを書きましょう.arm、armv 7、x 86の面倒なこともあります.
LOCALを変えてみたいMODULE_FILENAMEがやってみよう、NDKは許さない.
そこでNDKのコンパイルスクリプトを少し見て、次のような解決策を発見しました.
NDKはAndroidでmkファイルのinclude$(BUILD_EXECUTABLE)は実行可能なファイルをコンパイルするために、実際にはすでに書かれたスクリプトであるbuild-executableを呼び出した.mk.(コンパイルスクリプトはすべてNDK_ROOT/build/coreディレクトリにあります)
スクリプトの呼び出しプロセスをよく見ると、スクリプトは最初に変数の正当性をチェックし(前にLOCAL_MODULE_FILENAMEを変更する方法はここでは通れない)、最終的にinclude$(BUILD_SYSTEM)/build-moduleを呼び出す.mkでコンパイルします.
そこでこのスクリプトを検討し,コンパイル出力を決定する変数を見つけ,最終的なコンパイルスクリプトを呼び出す前に所望のものに変更すればよい.
最終的に私の案は以下の通りです.
1.ndk本来のスクリプトを破壊しないようにbuild-executable.mkコピーは自分のプロジェクトディレクトリの下に置いて、最後から3行目に$(evalLOCAL_BUILT_MODULE:=$(TARGET_OUT)/$(MY_LOCAL_MODULE_FILENAME))を挿入します.
2.自分のAndroid.mkファイルで定義MY_LOCAL_MODULE_FILENAME変数、もちろん値はあなたが望むファイル名です.
3.コンパイル時にシステムのinclude$(BUILD_EXECUTABLE)を呼び出さず、自分のスクリプト(上にコピーして修正したスクリプト)を呼び出すように変更します.便宜上、自分のスクリプトに変数を定義して指向することができます.
そうです.
書き方が乱れているので、いくつかのキーコードを貼りましょう.
修正後のbuild-executable.mkコード.
LOCAL_BUILD_SCRIPT := BUILD_EXECUTABLE
LOCAL_MAKEFILE := $(local-makefile)
$(call check-defined-LOCAL_MODULE,$(LOCAL_BUILD_SCRIPT))
$(call check-LOCAL_MODULE,$(LOCAL_MAKEFILE))
$(call check-LOCAL_MODULE_FILENAME)
# we are building target objects
my := TARGET_
$(call handle-module-filename,,)
$(call handle-module-built)
$(eval LOCAL_BUILT_MODULE := $(TARGET_OUT)/$(MY_LOCAL_MODULE_FILENAME))
LOCAL_MODULE_CLASS := EXECUTABLE
include $(BUILD_SYSTEM)/build-module.mk
14行は私たちが加えた行です.上のファイルはjniルートディレクトリと、ディレクトリの下のAndroidに置いてあります.mkコード:
MY_BUILD_EXECUTABLE := $(JNI_ROOT)/build-executable.mk
include $(call all-subdir-makefiles)
実行可能ファイルをコンパイルするモジュールは、次のように書きます.
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := ...
LOCAL_MODULE := xxx
MY_LOCAL_MODULE_FILENAME := libxxx.so
LOCAL_C_INCLUDES := ...
LOCAL_LDLIBS:=-L$(SYSROOT)/usr/lib -llog
LOCAL_CFLAGS := -fPIC
include $(MY_BUILD_EXECUTABLE)
OK、大成功!