4

我正在尝试根据所选的 ABI 库在 Android NDK 项目中控制我的 C 代码。

首先,我希望 NDK 库方法用字符串回答使用的 ABI。我做了几次尝试,但都未能提供结果。

在 Application.mk 我定义
APP_ABI := all

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
#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  
}

对于所有体系结构,结果字符串始终是“未知的”。(在硬件上测试 arm v6 和 arm v7,在模拟器上测试其他)

我可以在 make 文件中看到 $(TARGET_ARCH) 的实际内容吗?我可以只在我的 c 文件上运行预处理器并查看预处理结果吗?

或者我是直的并且需要一种完全不同的方法?

4

1 回答 1

3

您可以为此使用 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) {
    }
}

参考

于 2013-06-12T14:18:20.610 回答