如果您对您的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应用)
- (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应用)
尝试编译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
# 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失败
当我运行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,并且在这里遇到了这个令人困惑的错误:
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:
- 首先环境配置必不可少,包括下载安装CMake,ndk-build插件,在上一篇“Android studio NDK成长记录(一)“中已经有详细介绍.
- 创建.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的一些规则。 - 书写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)
- 将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'' } } }
- 书写java中的native方法,创建一个类,在该类中声明一个native方法,不需要实现。
package com.picovr.justndkbuild.nativeclass; /** * Created by PICO-USER Dragon on 2017/2/6. */ public class JNI { public native String getString(); }
- 书写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> /** * 命名规则:返回值类型 + 方法名 * 方法名:是Java中native方法的包名+类名+方法名,并且把''.''给为''_'' * * JNIEXPORT和JNICALL 可要可不要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 !"); }
- 加载动态链接库,调用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(); }
- 调用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等相关内容,可以在本站寻找。
本文标签: