2013-05-17 3 views
3

필자는 필요한 Android make 파일을 동적으로 만드는 CMake 스크립트를 기반으로 Android NDK 빌드를 설정하려고합니다. 내가 JNI 폴더 구조를 사용할 수없는 동안 나는 몇 가지로 구분 메이크업 스크립트에서 빌드 프로세스를 분할 :정적 라이브러리의 Prebuild가 실패했습니다.

프로젝트 루트에있는 루트 Android.mk 파일 만들기 1 : 만들기

#ANDROID ROOT MAKEFILE 

LOCAL_PATH := D:/binrev/repository/bar 
include $(CLEAR_VARS) 

MY_LOCAL_CFLAGS := -DDEBUG 
include D:/binrev/repository/bar/src/Android.mk 

2 소스 Android.mk를 프로젝트 소스 폴더에있는 파일 및 모듈 빌드를 수행 :

$(info "[INFO] Source Makefile invoked") 

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

LOCAL_MODULE := bar 
LOCAL_C_INCLUDES:= D:/binrev/repository/bar/include 
LOCAL_SRC_FILES := bar.cpp 

ifeq (debug,"debug") 
    MY_LOCAL_CFLAGS := -DDEBUG 
endif 

ifeq (false,true) 
    LOCAL_ARM_MODE := arm 
endif 

LOCAL_EXPORT_C_INCLUDES := D:/binrev/repository/bar/include 

LOCAL_LDLIBS := -llog 
LOCAL_LDLIBS += -landroid 

LOCAL_STATIC_LIBRARIES += foo 

ifeq (OFF, ON) 
    include $(BUILD_SHARED_LIBRARY) 
else 
    include $(BUILD_STATIC_LIBRARY) 
endif 

Basicly이 메커니즘이 작동하고 내 소스를 컴파일 할 수 있지만, 나는 도서관의 사전 빌드를 포함하려고하면 나는 실패합니다. 내가 정적 라이브러리의 을 미리 빌드 포함하는 다음과 같은 방법을 시도 (수정 된 소스와 함께/정의를 포함) : 소스

include $(CLEAR_VARS) 
LOCAL_MODULE := foo 
LOCAL_SRC_FILES := lib/android/$(TARGET_ARCH_ABI)/libfoo.a 
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include 
include $(PREBUILT_STATIC_LIBRARY) 

1 사전 빌드 정의가 Android.mk가 2 통화 가져 오기 모듈 메커니즘을 제출하고 추가 사전 빌드 Android.mk 파일은 루트에 3 사전 빌드 정의를 LIB에게-사전 빌드 Android.mk

[편집 :] 파일로 여기에도 실패하는 호출 가져 오기 테스트를 냈다된다 $를 (정보 "[INFO] 소스 Makefile이 호출 됨 ")

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

LOCAL_MODULE := bar 
LOCAL_C_INCLUDES:= D:/binrev/repository/bar/include 
LOCAL_SRC_FILES := bar.cpp 

ifeq (debug,"debug") 
    MY_LOCAL_CFLAGS := -DDEBUG 
endif 

ifeq (false,true) 
    LOCAL_ARM_MODE := arm 
endif 

LOCAL_EXPORT_C_INCLUDES := D:/binrev/repository/bar/include 

LOCAL_LDLIBS := -llog 
LOCAL_LDLIBS += -landroid 

LOCAL_STATIC_LIBRARIES += foo 

ifeq (ON, ON) 
    include $(BUILD_SHARED_LIBRARY) 
else 
    include $(BUILD_STATIC_LIBRARY) 
endif 

$(call import-module, external-deps/foo) 

각 경우에 prebuild-definition이있는 스크립트가 호출되지만 미리 작성된 은 수행되지 않습니다. 내 NDK 빌드가 완료되면 사전 빌드 라이브러리와 오브젝트가 내 obj 폴더에 복사되지 않습니다. prebuild는 완전히 무시 된 입니다. 그러나 소스를 미리 빌드하는 경로는 정확합니다. 그렇지 않으면 컴파일이 실패하고 파일 누락 오류가 발생합니다. [테스트 프로젝트] [1] https://sourceforge.net/projects/binrevengine/files/publications/

힌트 :

는 현재이 테스트 구현의 완전한 소스를 얻을 수있는 바 프로젝트는 푸 프로젝트를 사전 빌드하려고 프로젝트입니다. foo 프로젝트는 사전 빌드 소스를 포함합니다.

추가 된 테스트 프로젝트는 CMake 및 미리 설치된 NDK (r8e 사용)를 사용하여 GCC 4.7/4.8에서 MinGW64를 사용하여 직접 빌드 할 수 있습니다.

나는 completly 길을 잃어 버리거나 아이디어가 부족합니다 ... 도움을 주셔서 감사합니다.

답변

0

Android 빌드 시스템은 공유 라이브러리에서 사용하지 않고 정적 라이브러리를 빌드하지 않습니다.

include $(CLEAR_VARS) 
LOCAL_MODULE := dummy 
LOCAL_PATH := $(LOCAL_PATH) 
LOCAL_SRC_FILES := dummy.c 
LOCAL_STATIC_LIBRARIES := foo 
include $(BUILD_SHARED_LIBRARY) 
+0

bar 프로젝트는 foo 프로젝트를 참조하는 공유 라이브러리로 빌드됩니다. – Hellhound

+0

소스 샘플을 편집하고 호출 모듈 가져 오기 테스트의 make 파일을 추가했습니다. – Hellhound

0

내가 그 파일의 CMake 발생기를 사용하지 않고 안드로이드 간단한 경우에 파일을 축소 한 결함의 가능한 원인을 제거하려면 : 그냥 의존성 봐라로 정적 라이브러리를 가지고 더미 공유 라이브러리를 생성

LOCAL_PATH := D:/binrev/repository/bar 
include $(CLEAR_VARS) 

LOCAL_MODULE := foo-prebuilt 
LOCAL_SRC_FILES := external-deps/foo/lib/android/$(TARGET_ARCH_ABI)/libfoo.a 
include $(PREBUILT_STATIC_LIBRARY) 


include $(CLEAR_VARS)   
LOCAL_MODULE := bar 
LOCAL_C_INCLUDES:= D:/binrev/repository/bar/include 
LOCAL_C_INCLUDES+= D:/binrev/repository/bar/external-deps/foo/include 
LOCAL_SRC_FILES := src/bar.cpp 


LOCAL_LDLIBS := -llog 
LOCAL_LDLIBS += -landroid 

LOCAL_SHARED_LIBRARIES := foo-prebuilt 
include $(BUILD_SHARED_LIBRARY) 

과 :

LOCAL_PATH := D:/binrev/repository/foo 

include $(CLEAR_VARS) 

LOCAL_MODULE := foo 
LOCAL_C_INCLUDES:= D:/binrev/repository/foo/include 
LOCAL_SRC_FILES := src/foo.cpp 

LOCAL_LDLIBS := -llog 
LOCAL_LDLIBS += -landroid 

include $(BUILD_STATIC_LIBRARY) 

실패는 여전히 존재합니다. foo 라이브러리의 prebuild는 실행되지 않습니다.또한 MinGW64를 가능한 결함 소스로 제외했습니다. Windows 명령 줄을 사용하여 프로젝트를 빌드하면 동일한 문제가 발생합니다. 공유 라이브러리는 빌드되었지만 사전 빌드는 실행되지 않습니다.

원본과 스크립트를 여러 번 확인했지만 실패하지는 않았습니다. 어떤 아이디어가 잘못되었거나 누락되었을 수 있습니까?

관련 문제