2014-12-16 3 views
1

그냥 안드로이드 ndk을 사용하여 간단한 "helloworld"를 빌드합니다.하지만 실행 파일을 가져올 샤드 오브젝트가 있습니다. 그리고이 파일을 내 팔 에뮬레이터에 푸시 한 후 세그먼트 오류가 발생했지만 실제 장치는 정상입니다. 뭐가 문제 야?ndk 실행 파일을 가져올 수 없습니다

다음
Darwin avator 13.4.0 Darwin Kernel Version 13.4.0: Sun Aug 17 19:50:11 PDT 2014; root:xnu-2422.115.4~1/RELEASE_X86_64 x86_64 i386 MacBookPro11,1 Darwin 

Android.mk입니다 : 여기 내 운영 체제 버전입니다

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 
LOCAL_MODULE := test-libstl 
LOCAL_SRC_FILES := test-libstl.cpp 
include $(BUILD_EXECUTABLE) 

그리고 ndk-build 후, 나는 파일을 가지고 : 자체

$file ../libs/arm64-v8a/test-libstl 
../libs/arm64-v8a/test-libstl: ELF 64-bit LSB shared object, version 1 (SYSV), dynamically linked (uses shared libs), stripped 

답변

2

이 오류되지 않습니다 - 위치에 독립적 인 실행 파일 (PIE)을 공유 객체로 해석하는 유틸리티는 file뿐입니다. 실행 파일이 구축되었습니다. 좋아.

Android 4.1 이상에서만 PIE 실행 파일을 지원하며 5.0에서는 PIE가 아닌 실행 파일이 더 이상 허용되지 않습니다. 이것이 에뮬레이터에서 실행할 수없는 이유 일 수 있습니다. 이 문제에 대한 자세한 내용은 Running a native library on Android L. error: only position independent executables (PIE) are supported을 참조하십시오. NDK의 대상 플랫폼이 Android 4.1 이상 (android-16) 인 경우 실행 파일은 PIE를 사용하도록 설정됩니다.

+0

이것은 내 에뮬레이터의 버전이 4.0이고 실제 장치가 4.4.Just 또 다른 두 가지 질문입니다. 1. PIE는 안드로이드 4.1 이상이어야합니다. 2. 에뮬레이터 4.0에서 실행할 수있는 또 다른 파일이 있는데'file'은 ELF 32 비트 LSB 실행 파일, ARM, 버전 1 (SYSV), 동적 링크 (공유 라이브러리 사용), 스트립 된 파일을 보여줍니다. 이거 좀 혼란스러워.이 파일 PIE? thks. –

+0

아니요, PIE는 안드로이드 4.1에서 필수는 아니지만, 5.0에서는 필수 사항입니다. 'file'이 실행 파일이라고 말하는 두 번째 파일은 PIE가 아니며 5.0에서는 실행되지 않습니다. – mstorsjo

+0

어떻게 안드로이드 4.0에서 실행할 수있는 비 PIE 실행 파일을 만들 수 있습니까?'APP_PIE : = false'와'APP_PLATFORM : = android-9'를'Application.mk'에 설정하려고 시도했지만 효과가 없습니다. ndk는 r10입니다. –

관련 문제