Как оптимизировать нативный код с помощью android-ndk (Speed Optimization)
Я компилирую нативный код, используя cygwin и Windows7. Я получил много советов по оптимизации в Интернете.
APP_OPTIM := release
ndk-build NDK_DEBUG=0
-DNDEBUG
LOCAL_CFLAGS += -O2
Но я не могу точно понять, как установить их на Application.mk и Android.mk. Я перепробовал много случаев, применяя приведенные выше советы. но я не думаю, что оптимизация применяется в моем родном коде.
Application.mk
APP_PROJECT_PATH := $(shell pwd)
APP_MODULES := native_lib
APP_OPTIM := release
APP_BUILD_SCRIPT := Android.mk
APP_ABI := armeabi
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := crypto
LOCAL_SRC_FILES := lib/libcrypto.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := native_lib
LOCAL_SRC_FILES := nativeC.c \
AES/main.c \
AES/aes.c \
LOCAL_C_INCLUDES := ./lib
LOCAL_SHARED_LIBRARIES := crypto
LOCAL_CFLAGS += -O2
LOCAL_CFLAGS += -march=armv6 -marm -mfloat-abi=softfp -mfpu=vfp
LOCAL_LDLIBS += -ldl
include $(BUILD_SHARED_LIBRARY)
Я надеюсь, что много комментариев.
К тому же,
Сначала я попытался сравнить случаи с вышеуказанным флагом и без него. (Например, я скомпилировал свою программу с APP_OPTIM:= release в Application.mk, а затем я скомпилировал без нее или с APP_OPTIM:= debug, снова.) Но я не вижу никаких изменений скорости работы.
Во-вторых, это самое главное, моя программа сравнивает скорость двух модулей. (Для удобства я называю их модулями A, B). Модуль A предварительно собран (это libcrypto.so в Android.mk). И я хочу применить оптимизацию в модуле B. Прежде всего, я сравнил тест скорости модулей A и B на ПК (Visual Studio 2010). Когда я попробовал модули A и B на ПК, модуль B работает быстрее, чем A. (Конечно, я предварительно скомпилировал модуль A и использую его, вызывая библиотеку.) Теперь я портирую в него свою программу для ПК. для Android. Но в Android модуль B работает медленнее, чем A.
Поэтому я пришел к выводу, что это не оптимизировано.
В итоге,
- Я сравнил скорость с флагом и без него.
- При запуске этой программы на ПК предварительно скомпилированный модуль A работает быстрее, чем B, но в Android он полностью противоположен.
Вы думаете, в чем проблема моей программы? Заранее спасибо.
1 ответ
APP_OPTIM:= выпуск
Поставить линию APP_OPTIM := release
в ваш файл Application.mk
ndk-build NDK_DEBUG=0
Просто передайте NDK_DEBUG=0
в качестве параметра для ndk-build
скрипт. Вам не нужно это, как только вы определите APP_OPTIM := release
,
-DNDEBUG
Это должно войти в ваш LOCAL_CFLAGS
:
LOCAL_CFLAGS += -DNDEBUG
LOCAL_CFLAGS + = -O2
На самом деле это не требуется, поскольку Android NDK уже определяет -O2
оптимизация.