我已阅读This questionthis question,但我仍然无法让事情奏效 .

问题是一样的,我找到了本机方法并抛出了 UnsatisflyLinkError .

编辑:我发现问题是我的函数没有编译成so文件 .

cpu_check.c

#ifdef ANDROID
#include <jni.h>
#include <cpu-features.h>

JNIEXPORT jboolean JNICALL Java_nz_ac_waikato_ffts_FFTS_has_neon
(JNIEnv *env, jclass jc)
{
    if (android_getCpuFamily() == ANDROID_CPU_FAMILY_ARM &&
        (android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON) != 0)
    return JNI_TRUE;

    // use NEON-optimized routines

    else
    return JNI_FALSE;

    // use non-NEON fallback routines instead
}
#endif

当我查看已编译的libcpucheck.so时,它没有 ~has_neon 函数 . 但它的大小为16K,有一些功能,如CPU检查 . 这是我的 Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := cpucheck
LOCAL_SRC_FILES := cpu_check.c

LOCAL_STATIC_LIBRARIES := cpufeatures
include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE := ffts
LOCAL_C_INCLUDES := jni/include jni/src
LOCAL_CFLAGS := -DHAVE_DECL_MEMALIGN -std=c99 \
    -Wno-pointer-to-int-cast -Wno-int-to-pointer-cast
LOCAL_SRC_FILES := \
    ffts_jni.c \
    src/ffts.c \
    src/ffts_nd.c \
    src/ffts_real.c \
    src/ffts_real_nd.c \
    src/ffts_small.c \
    src/patterns.c
LOCAL_LDLIBS := -llog 

ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
LOCAL_MODULE := ffts-vfp
LOCAL_CFLAGS += -DHAVE_VFP
LOCAL_SRC_FILES += \
    src/codegen.c \
    src/vfp.s
endif

include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE := ffts
LOCAL_C_INCLUDES := jni/include jni/src
LOCAL_CFLAGS := -DHAVE_DECL_MEMALIGN -std=c99 \
    -Wno-pointer-to-int-cast -Wno-int-to-pointer-cast
LOCAL_SRC_FILES := \
    ffts_jni.c \
    src/ffts.c \
    src/ffts_nd.c \
    src/ffts_real.c \
    src/ffts_real_nd.c \
    src/ffts_small.c \
    src/patterns.c
LOCAL_LDLIBS := -llog 

ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
LOCAL_MODULE := ffts-neon
LOCAL_CFLAGS += -DHAVE_NEON
LOCAL_ARM_NEON := true
LOCAL_SRC_FILES += \
    src/codegen.c \
    src/neon.s
endif

include $(BUILD_SHARED_LIBRARY)

$(call import-module,android/cpufeatures)