NDK

Android NDK GPIO操作(pcduino 装Android系统)

泪湿孤枕 提交于 2019-12-07 01:17:32
开发工具: Eclipse 开发语言: Java和c++ Pcduino跑Android系统让我兴奋了很长时间,也由此幻想了很多有趣的应用。例如 结合Yeelink做远程加电控制;结合微信开放接口与传感器向好友推送信息等等。 当然这些有趣的应用都离不开PCDUINO硬件的操作。那么在Android系统下怎么来操作硬件呢?我想大概有以下几种方式: 1、利用Arduino 库自己写c++程序然后编译成可执行文件,然后把可执行文件拷到PCDUINO中,添加权限,在模拟中端里运行可执行文件。 优点:Arduino库函数完善,非常容易操作。 缺点:貌似和Android开发的应用不能完美的结合。 2、利用Android 的Jni编程,直接驱动GPIO。 优点:开发工具简单,利用Eclipse进行交叉编译,同时编译Java和c++代码。并且把硬件操作函数生成.so文件直接打包APK中。 下面我们利用ANDROID NDK来开发一个简单实例: " 光电开关控制UI上的灯泡亮灭" 第一步:开发环境的搭建 1、安装Eclipse 2、安装ADT-v20插件(该版本已经直接支持Native编程) 3、安装CDT(编译c++代码) 3、安装android-ndk-r8e(该版本支持Windows,不用在Cygwin下编译了) 按照这种模式搭建的开发环境用起来非常上手,java和c++程序直接交叉编译

Windows下配置NDK-R9

只谈情不闲聊 提交于 2019-12-06 21:36:57
一、关于NDK Android NDK全称:Native Development Kit,即本地开发包。 1、NDK是一系列工具的集合。 NDK提供了一系列的工具,这些工具对开发者的帮助是巨大的。 它们能帮助开发者快速开发C(或C++)的动态库,并能自动将so库和java应用一起打包成apk。 NDK集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异, 开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so库。 NDK可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作。 2、NDK提供了一份稳定、功能有限的API头文件声明。 Google明确声明该API是稳定的,在后续所有版本中都稳定支持当前发布的API。 从该版本的NDK中看出,这些API支持的功能非常有限,包含有: C标准库(libc)、标准数学库(libm)、压缩库(libz)、Log库(liblog)。 二、NDK实例的实现 对于Windows环境下NDK的开发,如果使用的NDK是r7之前的版本,必须要安装Cygwin才能使用NDK; 从r7开始 ,Google的提供了一个ndk-build.cmd的脚本,可以直接用它编译,而 不需要使用Cygwin了 。 只需要为Eclipse Android工程添加一个Builder

利用 CMake 和 NDK 交叉编译 Android 下的可执行程序

蓝咒 提交于 2019-12-06 21:36:43
之前开发 Android 下的二进制程序都是开个 jni 目录, 手写 Android.mk, 然后调用 ndk-build 生成可执行文件, 这样的步骤. 但最近的工程需要用到 Lua 解析器执行 Lua 脚本, 因此需要处理的文件就多了, 再继续闷头写 Android.mk 就显得效率很低. 况且 CLion 也是通过 CMake 构建工程的, 因此就打算试试看能不能通过 CMake 来构建 Android 下的可执行文件. 结果当然是 OK, 现将基本配置记录如下. 基础环境 Ubuntu 14.04 CMake 3.3.0 android-ndk-r10e-linux-x86_64 准备 NDK Standalone Toolchain 虽然 NDK 的 prebuilt 目录中有提供编译链工具, 但使用起来并不方便. 所幸 NDK 还提供了一个可生成独立编译链工具的脚本. 因此先通过该脚本生成独立编译链. $NDK/build/tools/make-standalone-toolchain.sh --toolchain=arm-linux-androideabi-4.8 --install-dir=~/app/ndk_toolchain 该脚本的大部分选项都有默认值, 一般只需指定这两个参数就行了: --toolchain 该参数用于设置要使用的编译链, 在 $NDK

jni中的进程通讯的另一种实现方式

你说的曾经没有我的故事 提交于 2019-12-06 20:26:17
在adb shell中执行ps命令常看到后台进程,这些后台进程很多都是在JNI层创建的,并非普通的Android进程,那么问题来了,如何让进程通讯呢? 方式有很多种。 1. 创建socket进行通讯,“127.0.0.1”+ 特定的端口号。这种方式很常用。 2. 管道,父进程和子进程是可以通过管道来读写数据的。这个比较常用。 3. 直接写入特定的文件,这也是本博文要介绍的一种实现,这个估计用的很少,但是在某些情况下使用很有意思,尤其是对主进程来说,只需要写入文件。 Android是从Linux上修改过来的,Linux上不少api也是能够直接在Android上使用的,inotify就是其中一个,用于监控文件系统中的事件。当子进程监控特定的文件,父进程写入该文件时,子进程是能获取到该文件被修改的事件的,也就能直接读取文件中的内容了。以下是代码片段 size_t readBytes = read(fileDescriptor, p_buf, EVENT_BUF_LEN); int k = 0; while (k < readBytes){ struct inotify_event *event = ( struct inotify_event * )(p_buf + k); if (event->len > 0){ kesyPrintf("event.name=%s\n", event-

报错 error: use of undeclared identifier (AS)

青春壹個敷衍的年華 提交于 2019-12-06 20:25:27
Android studio编译程序时报错: D:/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include\locale:3548:30: error: use of undeclared identifier 'catopen' catalog __cat = (catalog)catopen(__nm.c_str(), NL_CAT_LOCALE); 换了ndk就报这个错,这是编译库的问题, 加上这句 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++ -std=c++11 -fPIC -w") 来源: CSDN 作者: P.TAN 链接: https://blog.csdn.net/tantion/article/details/85786326

NDK undefined reference to 错误

情到浓时终转凉″ 提交于 2019-12-06 20:18:15
前几天 在Android NDK下用C++编写程序时,出现了一个“NDK undefined reference to”的编译错误。其实原因很简单,在程序中调用了某个C++类XXX,但是没有把该类的源文件 XXX.cpp 加入到Android.mk文件的LOCAL_SRC_FILES变量中,加上后问题就解决了。 这里需要注意的一点是,当有多个cpp文件时,可以用反斜杠(\)把多个cpp文件断行隔开,而反斜杠(\)后面不能有包括空格在内的任何字符,否则无法编译通过。 来源: oschina 链接: https://my.oschina.net/u/925490/blog/182206

Android NDK :在 C语言代码中输出Log

限于喜欢 提交于 2019-12-06 12:39:31
Android NDK :在 C语言代码中输出Log 本篇文章来源于 Linux公社网站( www.linuxidc.com ) 原文链接: http://www.linuxidc.com/Linux/2012-07/66106.htm Android NDK 开发时,想要在 .c 文件中打印一些调试信息的话,是不能使用 printf() 方法的,NDK 根本不支持,就算写了,在 LogCat 中也不会显示,正确的方式应该是 调用NDK 下的log.h 来打印Log 日志,具体方法如下: 1. 导入log头文件:在你使用的 .c/ .cpp 文件中,导入 log.h 头文件: #include<android/log.h> 2. 定义LOG 函数:先定义一个全局变量,再定义一些输出的LOG函数: 1.#define LOG "ffmpegDemo-jni" // 这个是自定义的LOG的标识 2.#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG,__VA_ARGS__) // 定义LOGD类型 3.#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG,__VA_ARGS__) // 定义LOGI类型 4.#define LOGW(...) _

Android 增量更新实例(Smart App Updates)

吃可爱长大的小学妹 提交于 2019-12-06 12:26:14
目录[-] 官方说明 实现原理 实现 (1)生成差异包 (2)使用旧apk+差异包,在客户端合成新apk 注意事项 demo 自从 Android 4.1 开始,Google引入了应用程序的增量更新。 官方说明 Smart app updates is a new feature of Google Play that introduces a better way of delivering app updates to devices. When developers publish an update, Google Play now delivers only the bits that have changed to devices, rather than the entire APK. This makes the updates much lighter-weight in most cases, so they are faster to download, save the device’s battery, and conserve bandwidth usage on users’ mobile data plan. On average, a smart app update is about 1/3 the sizeof a full APK

JNI基本使用

时光总嘲笑我的痴心妄想 提交于 2019-12-06 08:34:03
概述 从今天开始,准备研究一下JNI相关的开发,其实很早之前就想学习这方面的东西了,一个原因是平时开发中用的很少,就没研究,另外一个原因是因为其他方面的东西还是比较多的,所以没有时间来学习这部门内容。不过从今天起,为了向全面发展的道路上更迈进一步,开始学习JNI. 准备工作 开发JNI我们需要NDK这个东西?什么是NDK呢?简单给大家介绍一下,NDK是一系列工具的集合 NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。 NDK集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。 NDK可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作。 首先我们去下载NDK,然后放在磁盘的某个路径下,这里我放在了 D: \develop \android -ndk-r10e 这是第一步,然后我们就可以在开发环境中进行配置了,很简单,只需要一句话,我们就可以开始JNI的编程了。具体做法如下,在当前项目的local.properties文件中添加你ndk的路径 # Location of the SDK. This is only used by Gradle. #

Android下玩JNI的新老三种姿势

落爺英雄遲暮 提交于 2019-12-06 08:30:20
请尊重原创,转载请注明出处: http://blog.csdn.net/mabeijianxi/article/details/68525164 (本文已在 hongyang 微信公众号发布) 说明:本篇不撸代码,只玩编译,其包含了Android studio 2.2最新的JNI玩法 编译环境:macOS 10.12.3 工具包含:Android Studio 2.2 NDK-r14 在Android下要玩jni首先下载ndk是必须的,可以直接去 https://developer.android.google.cn/ndk/downloads/index.html 下载,当然我们家AS为开发者也提供了便捷 只需如图勾选然后OK即可,我的版本是r14,值得一提的是 google ndk-build 命令在 r13 后默认使用 Clang ,并将在后续版本中移除 GCC ,其编译速度更快、编译产出更小、出错提示更友好。 一、徒手编写Android.mk然后ndk-build编译: 这种编译其实是用make工具来玩的,在 linux 徒手写并编译过c的应该很清楚,通过编写makefile,然后再用make编译已经比不停的用gcc命令逐个编译要爽很多,但是 makefile 的编写还是有点蛋疼。程序员都是化繁为简善解人意的,通过 ndk 工具我们无需自己写 makefile 了