简体   繁体   English

Android使用NDK我得到了Android NDK:中止错误

[英]Android for using NDK i get Android NDK: Aborting error

In my current project I'm trying to use simple file which that written with C language, after install NDK , CMake , LLDB from android studio, my current path for ndk is : 在我当前的项目中,我尝试使用用C语言编写的简单文件,从android studio安装NDKCMakeLLDB ,我当前的ndk路径是:

ndk.dir=/Users/mahdi/Desktop/Home/Packages/AndroidSdk/ndk-bundle

and

gradle.properties content gradle.properties内容

android.useDeprecatedNdk=true

build.gradle: 的build.gradle:

defaultConfig {
    applicationId "ir.pishguy.myapp"
    minSdkVersion 17
    targetSdkVersion 25
    versionCode 1
    versionName "1.0"
    multiDexEnabled true
    vectorDrawables.useSupportLibrary = true

    ndk{
        moduleName "web_service_encryption"
        ldLibs "log", "z", "m"
        abiFilters "armeabi", "armeabi-v7a", "x86"
    }
}

Now when I try to make and install app I get this error: 现在,当我尝试制作和安装应用程序时,出现以下错误:

Error:(115) *** Android NDK: Aborting . 错误:(115)*** Android NDK:正在终止。 Stop. 停止。 Error:Execution failed for task ':app:compileDebugNdk'. 错误:任务':app:compileDebugNdk'的执行失败。 com.android.ide.common.process.ProcessException: Error while executing process /Users/mahdi/Desktop/Home/Packages/AndroidSdk/ndk-bundle/ndk-build with arguments {NDK_PROJECT_PATH=null APP_BUILD_SCRIPT=/Users/mahdi/Desktop/Home/Projects/Android/myapp/app/build/intermediates/ndk/debug/Android.mk APP_PLATFORM=android-25 NDK_OUT=/Users/mahdi/Desktop/Home/Projects/Android/myapp/app/build/intermediates/ndk/debug/obj NDK_LIBS_OUT=/Users/mahdi/Desktop/Home/Projects/Android/myapp/app/build/intermediates/ndk/debug/lib APP_ABI=armeabi-v7a,armeabi,x86} com.android.ide.common.process.ProcessException:执行进程/ Users / mahdi / Desktop / Home / Packages / AndroidSdk / ndk-bundle / ndk-build并带有参数{NDK_PROJECT_PATH = null APP_BUILD_SCRIPT = / Users / mahdi / Desktop /Home/Projects/Android/myapp/app/build/intermediates/ndk/debug/Android.mk APP_PLATFORM = android-25 NDK_OUT = / Users / mahdi / Desktop / Home / Projects / Android / myapp / app / build / intermediates / ndk / debug / obj NDK_LIBS_OUT = / Users / mahdi / Desktop / Home / Projects / Android / myapp / app / build / intermediates / ndk / debug / lib APP_ABI = armeabi-v7a,armeabi,x86}

And c file in jni folder: jni文件夹中的c文件:

#include<string.h>
#include<jni.h>
#include<android/log.h>

//  LOGI("hello") ?? LOGI("money %d",15)
#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "native", __VA_ARGS__))
#define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, "native", __VA_ARGS__))

const char key[] = "~yfj(e^m1)o@2pc!"; //16???
int len = 0;


unsigned char getByteNumber(unsigned char first, unsigned char end) {
    int firstPosition = 0, endPosition = 0;
    int position = 0;
    for (; position < 16; position++) {
        if (key[position] == first) {
            firstPosition = position;
        }
        if (key[position] == end) {
            endPosition = position;
        }
    }
    return (firstPosition << 4) | (endPosition);
}


void encrypt(unsigned char p[], unsigned char res[]) {
    int i = 0;
    for (; i < len; i++) {
        res[2 * i] = key[p[i] / 16];
        res[2 * i + 1] = key[p[i] % 16];
    }
}


void decrypt(unsigned char p[], char res[]) {
    int i;
    for (i = 0; i < len; i++) {
        res[i] = getByteNumber(p[i * 2], p[i * 2 + 1]);
    }
}

jstring Java_ir_pishguy_myapp_EncryptUtil_encrypt(JNIEnv *env, jclass this,
        jbyteArray src) {
    unsigned char *buff = (char*) (*env)->GetByteArrayElements(env, src, NULL);
    len = (*env)->GetArrayLength(env, src);
    unsigned char res[len * 2];
    encrypt(buff, res);
    res[len * 2] = '\0';
    (*env)->ReleaseByteArrayElements(env, src, buff, 0);
    jstring resStr = (*env)->NewStringUTF(env, res);
    return resStr;
}

jstring Java_ir_pishguy_myapp_EncryptUtil_decrypt(JNIEnv *env, jclass this,
        jbyteArray src) {
    unsigned char *buff = (char*) (*env)->GetByteArrayElements(env, src, NULL);
    len = (*env)->GetArrayLength(env, src);
    len = len / 2;
    signed char res[len];
    decrypt(buff, res);
    res[len] = '\0';
    (*env)->ReleaseByteArrayElements(env, src, buff, 0);
    jstring resStr = (*env)->NewStringUTF(env, res);
    return resStr;
}

APP_PLATFORM=android-25 APP_PLATFORM =机器人-25

It looks like the useDeprecatedNdk path is just wrong. 看来useDeprecatedNdk路径是错误的。 25 is your targetSdkVersion , not your minSdkVersion (NDK target needs to match your minimum target). 25是您的targetSdkVersion ,而不是您的minSdkVersion (NDK目标需要匹配您的最小目标)。 Switch away from the deprecated thing and use externalNativeBuild . 弃用不推荐使用的东西,并使用externalNativeBuild

The build issue you're seeing is because there's no such thing as android-25 in the NDK (we only have platforms where there are actually new native APIs to save on size). 您看到的构建问题是因为NDK中没有android-25之类的东西(我们只有在平台上实际上有新的本机API可以节省尺寸)。

Even if you fix that (by targeting 24 instead), you're going to have runtime issues on anything older than 24. Your NDK target needs to be 17 to match your minSdkVersion . 即使您解决了这个问题(通过将目标改为24),也将在24之前的版本上遇到运行时问题。您的NDK目标必须为17才能匹配minSdkVersion

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM