GVKun编程网logo

您的APP_BUILD_SCRIPT使用Android ndk-build指向未知文件(你的app应用)

13

如果您对您的APP_BUILD_SCRIPT使用Androidndk-build指向未知文件感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于您的APP_BUILD_SCRIP

如果您对您的APP_BUILD_SCRIPT使用Android ndk-build指向未知文件感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于您的APP_BUILD_SCRIPT使用Android ndk-build指向未知文件的详细内容,我们还将为您解答你的app应用的相关问题,并且为您提供关于(OK) 交叉编译hello.c for android (--sysroot),不使用Android.mk和ndk-build、Android NDK – 构buildTessTwo(安卓版Tesseract工具) – ndk-build失败、ANDROID PLACE_PICKER(builder.build(上下文)、Android studio NDK成长记录(二)ndk-build的有价值信息。

本文目录一览:

您的APP_BUILD_SCRIPT使用Android ndk-build指向未知文件(你的app应用)

您的APP_BUILD_SCRIPT使用Android ndk-build指向未知文件(你的app应用)

尝试编译Android NDK项目时出现以下错误:

ndk-build 
Android NDK: Your APP_BUILD_SCRIPT points to an unkNown file: /home/lAmbergar/work/APIExample/jni/Android.mk    
/home/lAmbergar/android/ndk/android-ndk-r5c/build/core/add-application.mk:116: *** Android NDK: Aborting...    .  Stop.

奇怪的是,“未知文件”(Android.mk)存在于报告为无效的路径下.

解决方法:

同样的问题(在Windows 7中),但原因是不同的.

在环境参数中搜索后,我发现名为“NDK_PROJECT_PATH”的邪恶的东西,其值是无效路径.

删除它,事情再次起作用;)

(OK) 交叉编译hello.c for android (--sysroot),不使用Android.mk和ndk-build

(OK) 交叉编译hello.c for android (--sysroot),不使用Android.mk和ndk-build

# export PATH=$PATH:/opt/android-on-linux/android-ndk-r8e/toolchains/arm-linux-androideabi-4.7/prebuilt/linux-x86_64/bin/

# arm-linux-androideabi-gcc --sysroot=/opt/android-on-linux/android-ndk-r8e/platforms/android-14/arch-arm/ hello.c -o hello

# adb push hello /data/

# adb shell

执行命令: 
chmod 700 /data/hello
/data/hello

+++++++++++++++++++++++++++++++++

# adb push hello /data/data/www/cgi-bin

宿主机浏览器:
http://192.168.0.101:8000/cgi-bin/hello

如果成功的话, 可以看到浏览器上 Hello world!
++++++++++++++++++++++++++++++++++++++++++++++++

[root@localhost 桌面]# gedit readdisk.c

#include <stdio.h>
    #include <fcntl.h>

    int main()
    {
        unsigned char buf[512];
        int fd = open("/dev/blk/mmcblk1", O_RDWR);

        printf("文件描述符%d", fd);
        if (fd < 0) {        // printf("%d\n",errno);
            return 0;
        }
        int num;
        num = read(fd, buf, 512);
        printf("读取字数%d", num);
        printf("\n");
        int i, j;
        for (i = 0; i < 32; i++) {
            for (j = 0; j < 16; j++)
                printf("%02X ", buf[i * 16 + j]);
            printf("\n");
        }
        printf("\n");
        close(fd);
        return 0;
    }


[root@localhost 桌面]# arm-linux-androideabi-gcc --sysroot=/opt/android-on-linux/android-ndk-r8e/platforms/android-14/arch-arm/ readdisk.c -o readdisk

++++++++++++++++++++++++++++++++++++
root@kltexx:/data # ./readdisk                                                                                                        
error: only position independent executables (PIE) are supported.

[root@localhost 桌面]# arm-linux-androideabi-gcc --sysroot=/opt/android-on-linux/android-ndk-r8e/platforms/android-14/arch-arm/ -pie -fPIE readdisk.c -o readdisk


Android NDK – 构buildTessTwo(安卓版Tesseract工具) – ndk-build失败

Android NDK – 构buildTessTwo(安卓版Tesseract工具) – ndk-build失败

当我运行ndk-build,它没有抱怨从以下错误:

$ ndk-build make: /…/android-ndk-r7/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc: Command not found Compile arm : jpeg <= jcapimin.c make: /…/android-ndk-r7/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc: Command not found make: *** [obj/local/armeabI/Objs/jpeg/jcapimin.o] Error 127

问题是,虽然它说“找不到命令”,“arm-linux-androideabi-gcc”存在于上面的path。 即使我直接从/…/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/运行“arm-linux-androideabi-gcc”,它也会给出同样的错误“command not found”

我也添加./toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin到我的path,但仍然得到相同的错误。 即使我尝试了不同版本的ndk(7,7b,6b)仍然是相同的错误! 在我看来,上面的gcc是为32位机器而我的机器是“Linux 2.6.32-37-x86_64”。 但我猜ndk包应该适用于32位和64位。 我对吗? 在使用之前是否需要编译或编译ndk? 我假设下载和解包是我必须做的。 对? 怎么样sdk? 我只是下载并解压缩在我有我的ndk相同的文件夹。 我需要configuration他们相互工作吗?

如何重新configuration​​文件以允许LiveCode使用Android模拟器?

Windows PC作为USB主机通过USB与Android设备进行通信

在centos中没有包lib32z1,lib32ncurses5,lib32stdc ++ 6

Windows和黑莓的图标大小和像素密度

三星galaxy SIII和ACR122U的互动

Android和Windows没有相同的TLSalgorithm

我使用了adb命令“pm block com.sonymobile.advancedwidget.entrance”如何解锁这个应用程序?

如何在我的Android中运行BASH脚本?

Android Studio Emulator – Ubuntu 16.04 LTS

Android的Maven插件 – 使用命令行太长的命令行创builddex(windows)

我遇到了同样的问题。 你是对的,问题是由于试图在64位内核上运行一个32位的二进制文件。

我通过安装32位兼容库来解决它在Ubuntu 11.10上的问题:

sudo apt-get install ia32-libs

ANDROID PLACE_PICKER(builder.build(上下文)

ANDROID PLACE_PICKER(builder.build(上下文)

基本上,我正在尝试为Android实现PLACE_PICKER,并且在这里遇到了这个令人困惑的错误:

    int PLACE_PICKER_REQUEST = 1;
    PlacePicker.IntentBuilder builder = new PlacePicker.IntentBuilder();
    Context context = getApplicationContext();
    startActivityForResult(builder.build(context), PLACE_PICKER_REQUEST);

错误即将出现在第4行:“(builder.build(context),”,我不知道为什么,我将其归类为错误:
未处理的异常:com.google.android.gms.common.GooglePlayServicesRepairableException,com.google.android.gms.common.GooglePlayServicesNotAvailableException.

多年来一直在解决这个问题…有什么帮助吗?

解决方法:

看来主要问题是您使用的是旧版Google Play服务.因此,为了使其适合您,您需要更新设备或仿真器上安装的Google Play服务的版本.

这也表明您没有任何代码可以检查设备上是否存在所需的版本,因此您绝对应该添加此代码,因为该领域的用户可能会遇到相同的问题.

如果设备上当前的版本比您的应用所需的版本旧,该框架提供了一种向用户添加提示以更新Google Play服务的简便方法.

这是我刚开始工作的一个简单示例.

首先,创建一个成员变量状态:

int status;

然后,在您的Activity的onCreate()中,检查Google Play服务是否可用.如果不是,则显示将提示用户升级的对话框:

    status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
    if (status != ConnectionResult.SUCCESS) {
        if (GooglePlayServicesUtil.isUserRecoverableError(status)) {
            GooglePlayServicesUtil.getErrorDialog(status, this,
                    100).show();
        } 
    }

然后,当您想要显示PlacePicker时,请确保状态指示Google Play服务可用.如果不满足此条件,您可能还希望向用户提供一些指示(在此处添加其他内容)(另请注意额外的try / catch).

           if (status == ConnectionResult.SUCCESS) {
                int PLACE_PICKER_REQUEST = 199;
                PlacePicker.IntentBuilder builder = new PlacePicker.IntentBuilder();
                Context context = this;
                try {
                    startActivityForResult(builder.build(context), PLACE_PICKER_REQUEST);
                } catch (GooglePlayServicesRepairableException e) {
                    e.printstacktrace();
                } catch (GooglePlayServicesNotAvailableException e) {
                    e.printstacktrace();
                }
            }

您还可以添加的一件事是,重新检查onActivityResult()中的状态,以查看用户是否已更新Google Play服务.
这也是从中获得PlacePicker对话框的结果的位置:

@Override
protected void onActivityResult (int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == 100){
        status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
    }
    if (requestCode == 199){

        //process Intent......
        Place place = PlacePicker.getPlace(data, this);
        String toastMsg = String.format("Place: %s", place.getName());
        Toast.makeText(this, toastMsg, Toast.LENGTH_LONG).show();
    }
}

结果:

Android studio NDK成长记录(二)ndk-build

Android studio NDK成长记录(二)ndk-build

Android studio NDK开发第二种方法 ndk-build:

  1.    首先环境配置必不可少,包括下载安装CMake,ndk-build插件,在上一篇“Android studio NDK成长记录(一)“中已经有详细介绍.
  2. 创建.c或者cpp源文件,和头文件,这一步可以先只是创建出.c和.h文件,不用急着书写.c源文件,只需搭好架子即可,书写c代码可以放到将gradle和ndk-build关联好之后,也就是第六步。(下面以c语言为例)
    第一种方式:
    在mian目录下新建jni文件夹。
    选中Android Studio的左下角Terminal面板,输入命令“cd app/src/main/java”进入java目录,执行命令“javah 包名+类名“,这个命令是调用jdk中的javah.exe程序对native方法所在的Java类生成一个对应的.h头文件。这种方式生成的.h头文件中,自动将native方法在C语言中所对应的方法名全部生成出来了。然后将生成的.h文件剪切到cpp文件夹,并将.h文件中放方法名称copy到c文件中,将参数补全即可。
    生成.h文件的命令如:“javah com.picovr.justndkbuild.nativeclass.JNI”
    第二种方式:
    在main目录新建文件夹jni,右键新建C/C++ Source File 勾选上Create an asscoiated hearder,这样就会生成一个.c文件和.h的头文件,这个.h文件不会像第一种方式那样自动生成native方法在C语言中所对应的方法名,需要自己手动去写。在学习阶段建议手动去做,更好地了解并熟悉jni的一些规则。
  3. 书写Android.mk文件,该文件名字必须为“Android.mk”,用于关联gradle和ndk-build,关联成功之后书写C代码时会有提示,否则不会有提示。Android.mk文件放在c资源文件所在module根目录中(比如app根目录)。书写好Android.mk文件后在module根目录下的build.gradle文件中配置ndk属性。Android.mk文件和build.gradle文件可配置如下:

    build.gradle :
    android {
        compileSdkVersion 25
        buildToolsVersion "25.0.0"
        defaultConfig {
            applicationId "com.picovr.justndkbuild"
            minSdkVersion 15
            targetSdkVersion 25
            versionCode 1
            versionName "1.0"
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    
            ndk {
                ldLibs "log"  moduleName "hello"  }
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile(''proguard-android.txt''), ''proguard-rules.pro''
            }
        }
    }

    Android.mk :
    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    
    #生成的so库的名字,必须跟module(如app:)下的build.gradle中配置的moduleName名字相同
    LOCAL_MODULE := hello
    
    LOCAL_LDFLAGS := -Wl,--build-id
    
    #需要在C代码中打印log到studio的控制台,第一步就需要配置该属性
    LOCAL_LDLIBS += -llog
    
    #本地 source file的地址,必须配置,Java代码才能找到源文件,并关联起来,最后面的''\''是换行,有多个文件直接按下面形式列出即可
    LOCAL_SRC_FILES := \
       E:\AndroidStudioProjects\JustNDKBuild\app\src\main\jni\hello.c \
    
    #本地 source file所在的目录
    LOCAL_C_INCLUDES += E:\AndroidStudioProjects\JustNDKBuild\app\src\main\jni
    LOCAL_C_INCLUDES += E:\AndroidStudioProjects\JustNDKBuild\app\src\main\jni
    
    include $(BUILD_SHARED_LIBRARY)
  4.     将gradle和ndk-build关联起来   ,可以手动关联,也可以自动关联,最后的结果是一样的。<1.>自动关联 : 将工程改为Android视图,右键选中module(如app),选择Link C++     Project with Gradle,下拉选项中选择ndk-build,浏览找到你的项目中的Android.mk文件,点击确定即可,studio会自动在该module下的build.gradle文件中配置好externalNativeBuild属性,最终结果与手动关联是一样的

    <2.>手动关联 : 在module下的build.gradle中按照下方的模板配置externalNativeBuild属性,该属性是指向你的Android.mk文件,让gradle编译的时候能找到该文件,按照该文件的配置进行编译
    配置好之后的build.gradle应该如下模样,注意看externalNativeBuild属性
    android {
        compileSdkVersion 25
        buildToolsVersion "25.0.0"
        defaultConfig {
            applicationId "com.picovr.justndkbuild"
            minSdkVersion 15
            targetSdkVersion 25
            versionCode 1
            versionName "1.0"
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    
            ndk {
                ldLibs "log"  moduleName "hello"  }
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile(''proguard-android.txt''), ''proguard-rules.pro''
            }
        }
    
        externalNativeBuild {
            ndkBuild {
                path ''Android.mk''  }
        }
    }
  5. 书写java中的native方法,创建一个类,在该类中声明一个native方法,不需要实现。
    package com.picovr.justndkbuild.nativeclass;
    
    /**
     * Created by PICO-USER Dragon on 2017/2/6.
     */
    
    public class JNI {
        public native String getString();
    }
  6. 书写c源代码
    java中的native方法对应C语言中的方法的规则在下面的代码中已经详细解释:
    copy下面的代码的时候,导包hello.h和jni.h分别copy,因为每个人的头文件名字不一样。ndk安装路径也不一样,所以jni.h所在目录不一样。
    /* Created by PICO-USER Dragon on 2017/1/17.
      导包的时候要注意
      1.你自己创建的.h文件必须要
      2.jni.h必须要,这个导包的时候,studio应该会提示,其实就是你安装ndk所在目录下的platforms目录中的任意
      一个版本中,可以在电脑中按照下面jni.h的那个路径中找来看看
     */
    
    #include "hello.h"
    #include "../../../../../../Android/SDK/ndk-bundle/platforms/android-21/arch-x86_64/usr/include/jni.h"
    #include <stdio.h>
    #include <stdlib.h>
    /**
     * 命名规则:返回值类型 + 方法名
     * 方法名:是Javanative方法的包名+类名+方法名,并且把''.''给为''_''
     *
     * JNIEXPORTJNICALL 可要可不要string Java_com_picovr_ndksupporttest_mynative_JNI_getString(JNIEnv *env, jobject jobj)也行
     *
     * jstring 是返回值对应java中的String
     * JNIEnv *env 必须参数,在C中必须要用到这个参数去调用方法
     * jobject jobj 必须参数 不一定用到
     */
    JNIEXPORT jstring JNICALL
    Java_com_picovr_ndksupporttest_mynative_JNI_getString(JNIEnv *env, jobject jobj) {
    
        //jstring     (*NewStringUTF)(JNIEnv*, const char*);其实是在调用ndk-build中的jni.h中的方法
        return (*env)->NewStringUTF(env, "The first jinDemo for Dragon !");
    
    }
  7. 加载动态链接库,调用c代码
    在native方法所在类中增加静态代码块,加载动态链接库
    package com.picovr.justndkbuild.nativeclass;
    
    /**
     * Created by PICO-USER Dragon on 2017/2/6.
     */
    
    public class JNI {
    
        // Used to load the ''hello'' library on application startup. 
        static {
            //"hello"是so库的名字,也就是CMakeLists.txt文件中add_library()属性中的第一个参数 
            System.loadLibrary("hello");
        }
    
        public native String getString();
    }
  8. 调用native方法,看看是否成功!
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            String string = new JNI().getString();
            Log.i("MainActivity", "onCreate string :" + string);
        }
    }

 

关于您的APP_BUILD_SCRIPT使用Android ndk-build指向未知文件你的app应用的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于(OK) 交叉编译hello.c for android (--sysroot),不使用Android.mk和ndk-build、Android NDK – 构buildTessTwo(安卓版Tesseract工具) – ndk-build失败、ANDROID PLACE_PICKER(builder.build(上下文)、Android studio NDK成长记录(二)ndk-build等相关内容,可以在本站寻找。

本文标签: