2016-04-22 15 views
11

私はmakeシステムの不満の中で、私は何年も前にすべてのコードを単純に混乱させて作業しているネイティブプロジェクトを持っています。私はプロジェクトを適切にgradle-experimentalに移植しようとしましたが、それはまだ2.5年後の災害です。私は今、再構成された(gradle-experimentalの)プロジェクトでAndroid.mkシステムが動作するようにしようとしています。Android ndkネストされたモジュール

  • JPEG(フルネイティブ)
  • プロセッサ(フルネイティブ、JPEGに依存)
  • ライブラリ(JNI、プロセッサおよびJPEGに依存)

:ここ

は、組織の
module 
-jni (contains Application.mk, Android.mk) 
-jpeg 
--src 
---main 
----jni 
-----Android.mk (and source co-located) 
-processor 
--src 
----main 
-----jni 
------Android.mk 
------/processor(source) 
-library 
--src 
----main 
-----java 
-----jni 
-----Android.mk (and source co-located) 

私はこれを平らにすることができます私はmakeファイルを使用していますが、2020年にはいつかはAndroid Studioがネイティブをサポートしているので、現在のプロジェクト形式を維持すると思いました。ここで

は私のメイクファイルは、次のとおりです。JNI

モジュール/:

LOCAL_PATH := $(call my-dir) 
STARTUP_DIR := $(LOCAL_PATH) 

include $(STARTUP_DIR)/../jpeg/src/main/jni/Android.mk 
include $(STARTUP_DIR)/../processor/src/main/jni/Android.mk 
include $(STARTUP_DIR)/../library/src/main/jni/Android.mk 

include $(CLEAR_VARS) 

JPEG/JNI:

LOCAL_PATH:= $(call my-dir) 
include $(CLEAR_VARS) 

LOCAL_ARM_MODE := arm 

LOCAL_SRC_FILES := [truncated] 

LOCAL_CFLAGS += -DAVOID_TABLES 
LOCAL_CFLAGS += -O3 -fstrict-aliasing -fprefetch-loop-arrays 
#LOCAL_CFLAGS += -march=armv6j 

# enable tile based decode 
LOCAL_CFLAGS += -DANDROID_TILE_BASED_DECODE 

ifeq ($(TARGET_ARCH_VARIANT),x86-atom) 
    LOCAL_CFLAGS += -DANDROID_INTELSSE2_IDCT 
    LOCAL_SRC_FILES += jidctintelsse.c 
endif 

# enable armv6 idct assembly 
ifeq ($(strip $(TARGET_ARCH)),arm) 
    LOCAL_CFLAGS += -DANDROID_ARMV6_IDCT 
endif 

# use mips assembler IDCT implementation if MIPS DSP-ASE is present 
ifeq ($(strip $(TARGET_ARCH)),mips) 
    ifeq ($(strip $(ARCH_MIPS_HAS_DSP)),true) 
    LOCAL_CFLAGS += -DANDROID_MIPS_IDCT 
    LOCAL_SRC_FILES += \ 
     mips_jidctfst.c \ 
     mips_idct_le.S 
    endif 
endif 

LOCAL_MODULE := libjpeg 

include $(BUILD_STATIC_LIBRARY) 

プロセッサ/ JNI

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 

LOCAL_CFLAGS += -DUSE_JPEG 
LOCAL_STATIC_LIBRARIES += libjpeg 
LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../../../jpeg/src/main/jni 

LOCAL_MODULE  := processor 

LOCAL_SRC_FILES := [truncated] 

LOCAL_C_INCLUDES += [truncated] 

LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/processor/include 
LOCAL_LDLIBS += -lz 

include $(BUILD_SHARED_LIBRARY) 

ndk-buildを実行すると、プロセッサビルド時にjpegが正常に構築されます。私は私がやっている感じを持っている「

`jpeg_std_error(jpeg_error_mgr *)への未定義参照

を:それはしかし、のような未定義の参照を(プロセッサ)で任意のコード参照のjpegを構築するために失敗します。 LOCAL_STATIC_LIBRARIES += libjpegが正しくインポートされないように、親のAndroid.mkを設定する際に何らかの問題があります。誰でも私がここで間違っているかもしれないことを知っていますか?

答えて

6

私は、C++でネームマングリングを助けるためにextern "C"を持たない間違ったjpegヘッダーを引っ張った。ヘッダーを修正することで問題が解決されました。

また、すべてのプロジェクトがjniに該当しない場合、ネストされたNDKは悪夢であるため、フォルダ構造を再構成する必要がありました。 LOCAL_PATH、ワイルドカード、基本的には相対パスのマングリングを開始します。

+0

「プル」とはどういう意味ですか? – rmtheis

+1

私はextern "c"を追加したアンドロイド互換のjpeg-turboライブラリを使用していましたが、何年も後にgradle-experimentalに移植しようとしたときに正しいブランチを忘れることを完全に忘れました。それは私が "間違ったものを引っ張った" – Anthony

関連する問題