선택한 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 파일에서 전처리기만 실행하고 전처리 된 결과를 볼 수 있습니까?
아니면 완전히 다른 접근 방식이 필요합니까?
감사합니다! 그러나 전처리기를 사용하여 이러한 것들을 분류하지 않는 것이 "옳지 않다"는 느낌이 든다. 결국, 각 CPU 코어마다 별도의 라이브러리가 생성되고 모든 아키텍처의 코드를 모든 라이브러리 솔기로 컴파일하여 불필요한 부분을 만듭니다. –
글쎄, 내 대답에 링크 된 페이지가 이렇게하는 다른 방법을 보여줍니다. 예를 들어'ifeq ($ (TARGET_ARCH_ABI), armeabi-v7a)를 할 수 있습니다. LOCAL_CFLAGS : = -DARCH_ARMEABI_V7A endif' – Michael
고마워요! 분명히 원래 코드에 두 가지 오류가있었습니다. 나는 "$ (TARGET_ARCH_ABI)"가 아닌 "$ (TARGET_ARCH)"를 사용했으며이 변수의 값을 직접 플래그를 작성하는 데 사용할 수 있다고 생각했습니다. –