2013-07-13 1 views
0

Mac에 Android 빌드 환경이 있습니다. ant debug을 실행하면 배포 용으로 APK 파일 내에 libandroidnative.so을 깔끔하게 정리합니다. 이것은 예상대로 작동합니다.Android APK 생성이 .so 파일을 가져 오지 않습니다 - 이유가 무엇인가요?

빌드 설정을 Windows PC로 이전합니다. ant debug을 실행하면`libandroidnative.so '를 APK 파일에 꾸미지 않고 성공적으로 완료됩니다.

코드베이스는 정확히 동일합니다. 동일한 repo에서 가져온 코드베이스입니다. NDK (r8) 및 SDK (2013-05-22)의 버전은 완전히 동일합니다. 같은 일이 이클립스 빌드에서 발생하는 것을

res/layout/main.xml 
AndroidManifest.xml 
resources.arsc 
res/drawable-hdpi/ic_launcher.png 
res/drawable-ldpi/ic_launcher.png 
res/drawable-mdpi/ic_launcher.png 
res/drawable-xhdpi/ic_launcher.png 
classes.dex 
lib/armeabi/gdbserver 
lib/armeabi-v7a/gdbserver 
lib/x86/gdbserver 
META-INF/MANIFEST.MF 
META-INF/CERT.SF 
META-INF/CERT.RSA 

참고 : 여기에

res/layout/main.xml 
AndroidManifest.xml 
resources.arsc 
res/drawable-hdpi/ic_launcher.png 
res/drawable-ldpi/ic_launcher.png 
res/drawable-mdpi/ic_launcher.png 
res/drawable-xhdpi/ic_launcher.png 
classes.dex 
lib/armeabi/gdbserver 
lib/armeabi/libandroidnative.so <--- success! 
lib/x86/gdbserver 
lib/x86/libandroidnative.so 
META-INF/MANIFEST.MF 
META-INF/CERT.SF 
META-INF/CERT.RSA 

내 PC에서 작동하지 않는 출력 : 여기에

내 Mac에서 (작업) 출력 .

<?xml version="1.0" encoding="UTF-8"?> 
<project name="AndroidNativeLayer" default="help"> 

    <property file="local.properties" /> 

    <property file="ant.properties" /> 

    <property environment="env" /> 
    <condition property="sdk.dir" value="${env.ANDROID_HOME}"> 
     <isset property="env.ANDROID_HOME" /> 
    </condition> 
    <loadproperties srcFile="project.properties" /> 

    <fail 
      message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable." 
      unless="sdk.dir" 
    /> 
    <import file="custom_rules.xml" optional="true" /> 

    <import file="${sdk.dir}/tools/ant/build.xml" /> 

</project> 
+0

FWIW을 "병합"허용, 다른 차이가있다. 같은 디렉터리 내용에서 작업하고 있는지 * 확실합니까? 그리고 PC에서 로컬'ndk-build'를 해 보셨습니까? – CommonsWare

+0

좋은 시력. 내 Mac에서는 체크 아웃 후 armeabi-v7a를 추가했습니다. 도움이된다면 방금 PC에서 전체 내용을 비교 했으므로 관련 변경 사항이 없습니다. 로컬 NDK 빌드를 완료했으며, 빌드 된 obj 파일이 APK에 삽입 할 준비가 된 업데이트 된 날짜 스탬프와 함께 바로 거기에 앉아 있습니다. –

+0

푸우. 나는 'armeabi-v7' 단서가 도움이되기를 바랬다. 나는 무엇이 잘못 될지 모른다. 만약 당신이 여기에 어떤 사랑을 얻지 못한다면, 여전히 주변에 있다면'android-ndk' 구글 그룹을 시도해 볼 수 있습니다. – CommonsWare

답변

1

내가 그것을 가지고 :

은 여기 내 Ant 빌드 파일 (산세 코멘트)입니다. TLDR; eclipse는 실행중인 ndk-build가 새로운 하나를 생성하는지 여부와 관계없이 새로운 .so 파일을 생성하기 전에 이전의 .so 파일을 삭제합니다. . ndk-build 명령이 새로운 명령을 작성하는지 확인하십시오.

필자의 경우, 환경 변수가 특정 값으로 설정된 경우에만 필자가 작성했습니다. 환경 변수가 불일치 인 경우 자동으로 종료 된 Android.mk에 논리 분기가 있습니다.

Linux/Mac의 경우 set SOME_VAR="foo"을 입력 할 수 있습니다. Windows의 배치 파일에서 집합 SOME_VAR="foo"을 입력하면 환경 변수 이름에 따옴표가 포함됩니다.

전적으로 내 잘못입니다. 나는이 질문의 시작에 일반적인 지혜가 관련 될 수 있기 때문에 질문을 계속하고있다.

또한 이해할 수 있습니다. aapt list bin\somepackage.apk을 입력하면 원래 게시에 사용한 목록을 생성 할 수 있습니다.

0

http://docs.xamarin.com/guides/android/advanced_topics/cpu_architecture에 따르면 기본 라이브러리는 다양한 Android 버전에 따라 다르게 동작합니다. 4.0 이전 안드로이드 버전을 대상으로 할 때

안드로이드 4.0 이전에 아이스크림 샌드위치는

결과적으로 .apk 파일 내에서 하나의 ABI에서 네이티브 라이브러리를 추출합니다, 각각의 모든 네이티브 라이브러리를 제공 할 필요가있다 응용 프로그램이 지원할 ABI.

및 추가에, 그것은

안드로이드 4.0 아이스크림 샌드위치가 추출 로직을 변경 있음을 언급하고있다.그것은 , 모든 네이티브 라이브러리를 열거 파일의 기본 이름이 이미 추출되었는지 여부를 확인하고 다음 조건이 모두 충족되는 경우, 다음 라이브러리는 이미 추출되지 않은

추출됩니다 것입니다. 기본 라이브러리의 ABI는 대상의 기본 또는 보조 ABI 과 일치합니다.

불행히도이 동작은 순서에 따라 다릅니다.

네이티브 라이브러리는 "순서대로"처리되며 ( 예제에서는 unzip으로 나열) 첫 번째 일치 항목이 추출됩니다.

> 그것은 권장 : .apk를 이 libtwo.so의 armeabi와 armeabi-V7A 버전을 포함하고 armeabi가 먼저 나열되어 있기 때문에, 추출 된 armeabi 버전, 하지 armeabi-V7A 버전입니다 앱이 4.0.4 이전의 Android에서 실행되는 경우 에는 armeabi가 아닌 armeabi-v7a 만 포함됩니다. x86 또는 을 포함하면 다른 ABI가 문제를 일으키지 않습니다. 그것은 단지 armeabi와 armeabi-v7a 모두의 포함입니다.

및 게시물에 대한 4.0.4

안드로이드 4.0.4 추출 로직을 변경

: 그 다음 주 ABI 버전을 추출, 모든 네이티브 라이브러리를 열거 파일의 기본 이름을 읽습니다 (있는 경우 현재) 또는 보조 ABI (있는 경우). 당신의 PC는 OS X의 버전에없는`lib 디렉토리/armeabi-V7A/gdbserver` 포함됩니다 :이 행동

관련 문제