2013-06-12 6 views
3

선택한 ABI 라이브러리에 따라 Android NDK 프로젝트에서 내 C 코드를 제어하려고합니다.Android 용 C 전처리기에 아키텍처 유형 (ABI) 가져 오기 NDK

처음에는 NDK 라이브러리 메소드가 문자열과 함께 사용되는 ABI를 대답하길 원합니다. 나는 몇 가지 시도를했지만 모두 결과를 전달하지 못했습니다. 내가
APP_ABI 정의 Application.mk에서

: =를

Android.mk는 다음과 같습니다 모든 :

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_CFLAGS += -D$(TARGET_ARCH) 
LOCAL_MODULE := get_current_abi 
LOCAL_SRC_FILES := get_current_abi.c 
include $(BUILD_SHARED_LIBRARY) 

그리고 마지막으로 내 C-파일은 다음과 같습니다 : 사용법 #include
#을 포함

jstring 
Java_com_example_abifinderlib_AbiFinder_getCurrentAbi(JNIEnv* env, jobject thiz) 
{ 
#if defined armeabi 
    return (*env)->NewStringUTF(env, "armeabi"); 
#elif defined armeabi-v7a 
    return (*env)->NewStringUTF(env, "armeabi-v7a"); 
#elif defined mips 
    return (*env)->NewStringUTF(env, "mips"); 
#elif defined x86 
    return (*env)->NewStringUTF(env, "x86"); 
#else 
    return (*env)->NewStringUTF(env, "unknown"); 
#endif 
} 

결과 문자열은 항상 "알 수 없음"입니다. 아키텍처. (테스트 한 팔 v6 및 팔 v7을 HW 및 기타 에뮬레이터에서)

make 파일에서 $ (TARGET_ARCH)의 실제 내용을 볼 수 있습니까? C 파일에서 전처리기만 실행하고 전처리 된 결과를 볼 수 있습니까?

아니면 완전히 다른 접근 방식이 필요합니까?

답변

2

당신은 CPU를 사용할 수 있습니다 이것에 대한 라이브러리를 특징 :

#include <cpu-features.h> 

AndroidCpuFamily family = android_getCpuFamily(); 
uint64_t features = android_getCpuFeatures(); 

if (family == ANDROID_CPU_FAMILY_X86) { 
} else if (family == ANDROID_CPU_FAMILY_MIPS) { 
} else if (family == ANDROID_CPU_FAMILY_ARM) { 
    if (features & ANDROID_CPU_ARM_FEATURE_ARMv7) { 
    } 
} 

(reference)

+1

감사합니다! 그러나 전처리기를 사용하여 이러한 것들을 분류하지 않는 것이 "옳지 않다"는 느낌이 든다. 결국, 각 CPU 코어마다 별도의 라이브러리가 생성되고 모든 아키텍처의 코드를 모든 라이브러리 솔기로 컴파일하여 불필요한 부분을 만듭니다. –

+1

글쎄, 내 대답에 링크 된 페이지가 이렇게하는 다른 방법을 보여줍니다. 예를 들어'ifeq ($ (TARGET_ARCH_ABI), armeabi-v7a)를 할 수 있습니다. LOCAL_CFLAGS : = -DARCH_ARMEABI_V7A endif' – Michael

+1

고마워요! 분명히 원래 코드에 두 가지 오류가있었습니다. 나는 "$ (TARGET_ARCH_ABI)"가 아닌 "$ (TARGET_ARCH)"를 사용했으며이 변수의 값을 직접 플래그를 작성하는 데 사용할 수 있다고 생각했습니다. –