最近在搞一个android上控制LED灯闪烁的功能,用到了串口编程,搜索了一下,发现Google发布了一个demo,android-serialport-api。有现成的代码和APK,要想自己改JNI也比较简单,就一个C文件。我把代码下载后,想在android studio下重新编一个so,在此记录一下。

一、环境准备:NDK(针对windows机器)

android SDK已经自带ndk-bundle了,对应的目录就是Android/sdk/ndk-bundle。先确保ndk-build命令能运行,打开CMD窗口,如果能看到以下内容,说明已经配置成功。

如果提示“不是内部命令或外部命令”之类的,那是环境变量没配好。

添加一个系统变量,指向本地ndk目录。

把新加的变量名加到Path路径后面即可。

二、生成头文件

当然可以通过命令行的方式,javah -jni 之类的,但是android studio已经简化这个工作了,配置一下,只需要右键生成.h文件即可。请看下面。

配置工作本质上也是调用javah命令。打开android studio的设置窗口,选择External Tools -> 新建(那个绿色+号)

填上以下内容。点击右边的Insert Macros有惊喜哦^^

为了后面在android studio直接运行ndk-build命令,此处也配置一个

好了,万事俱备,只差怎么生成JNI层的h文件了。

写一个包含native方法的Java,比如这样的:

非常简单,两个方法,位于android.serialport.api这个包下。下面要做的就是把它转成对应的h文件。

刚才添加的External Tools发挥作用了,只需要右键这个Java文件,执行javah即可。

接下来要做的就是把这个h文件拷到jni目录下,在这个目录再创建对应的实现文件C或者C++即可。

三、配置Android.mk和Application.mk文件

这两个配置文件,定义了输出so前的一些准备工作。Application.mk可以定义得很简单,如下:

APP_ABI := armeabi armeabi-v7a x86

意思是输出armeabi, armeabi-v7a, x86三种架构的so,如果只需要v7a,把其它两个删掉即可。Android.mk内容多了一点点。

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := serial_port
LOCAL_SRC_FILES := android_serialport_api_JavaNdk.c include $(BUILD_SHARED_LIBRARY)

前面两行和最后一行是固定的。LOCAL_PATH是定义的开始,用于查找源文件,至于怎么找不用管。my-dir由Build System提供,返回包含Android.mk的目录路径。CLEAR_VARS也是类似,指向一个Makefile。BUILD_SHARED_LIBRARY表示编译的是动态库。更多定义请参考android官方描述:Android.mk

serial_port就是要输出的so名字,当然最终会是libserial_port.so。LOCAL_SRC_FILES指向要编译的源文件。

四、生成so

只要前面都配置好,源代码也写好,最后一步就是生成so库了。在android studio中,jni目录中里面有Android.mk, Application.mk, h文件, h文件对应的C或C++文件,只需要在jni这个目录右键一下,选择ndk-build命令即可(上面配置的)。那么,在你的项目中就会成功输出so库了。会在项目根目录生成一个obj目录,里面就存放着生成的so。

如果之前生成出错,记得把obj目录清空一下,把错误解决后重新ndk-build。

在android studio中集成javah, ndk-build进行JNI开发的更多相关文章

  1. OpenCV - Android Studio 中集成Opencv环境(包含opencv_contrib部分)

    我在上一篇博客中说到了在Android中集成OpenCV,但是那个版本的OpenCV是没有SIFT和SURF算法的,因为这些算法是受专利保护的,所以并没有被包含在预编译库中,所以如果想要使用SIFT和 ...

  2. OpenCV - Android Studio 中集成Opencv环境(不包含opencv_contrib部分)

    OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,支持的运行环境也是非常的多,这篇文章主要讲的是Android环境集成OpenCV(IDE是Android Studio,我想Eclip ...

  3. Android Studio中的CmakeList NDK配置

    Android Studio2.2之后直接可以在创建工程时添加NDK支持了,添加之后,main文件夹下会多出一个native-lib.cpp这个文件,如果只为了一个简单的NDK接口,貌似这就结束了.直 ...

  4. 如何在android studio中cordova的混合开发

    基于Android Studio 中Cordova的开发 cordova简介 Cordova的前身是PhoneGap 官网: (http://cordova.io) Cordova应是运行在客户端本地 ...

  5. 在android studio 中使用applicationid的问题

    现在我需要对项目app的某个功能做性能测试,主要测试耗电量的多少. 1.我想到的方式是,我需要在同一台手机测试,同一个应用,需要安装在手机两次,第二次安装不覆盖第一次的安装. 在android stu ...

  6. 在Android Studio中进行单元测试和UI测试

    本篇教程翻译自Google I/O 2015中关于测试的codelab,掌握科学上网的同学请点击这里阅读:Unit and UI Testing in Android Studio.能力有限,如有翻译 ...

  7. 如何在Android Studio中添加注释模板信息?

    如何在Android Studio中添加注释模板信息? 在开发程序的时候,我们一般都会给文件自动添加上一些关于文件的注释信息,比如开发者的名字,开发的时间,开发者的联系方式等等.那么在android ...

  8. 在Android studio中进行NDK开发

     在Android studio中进行NDK开发  分类: Android平台 软硬件环境 ubuntu kylin 14.04 红米note增强版 Android studio 0.8.6 ndk ...

  9. OpenCV3.4.1快速集成到Android studio中,10分钟搞定

    OpenCV3.4.1快速集成到Android studio中,10分钟搞定     转载 https://blog.csdn.net/yu540135101/article/details/8259 ...

随机推荐

  1. HDU 3032 multi-sg 打表找规律

    普通NIM规则加上一条可以分解为两堆,标准的Multi-SG游戏 一般Multi-SG就是根据拓扑图计算SG函数,这题打表后还能发现规律 sg(1)=1 sg(2)=2 sg(3)=mex{0,1,2 ...

  2. 戴尔PowerEdge R430 机架式服务器 安装ubuntu server 14.04.1 LTS 64 位

    硬件配置: 服务编号:5Z04X72 软件配置 1.Ubuntu 系统下载地址: https://certification.ubuntu.com/certification/hardware/201 ...

  3. angularJS $resource

    $resource是一个更方便地与RESTful服务器API进行交互,可以方便地定义一个REST资源,而不必手动所有的声明CRUD方法的Service. 使用 1.要使用$resource首先要在HT ...

  4. idea插件安装的通用操作

    序:今天下午看到一个bug,很神奇,粘出来大家看看 看到这个异常栈,有经验的或者查到的答案都是mapper.xml中哪个的方法配置错了,应替换parameterMap为parameterType, 奇 ...

  5. dup()&dup2()

    [dup()&dup2()] 都是复制文件描述符指针.dup2可以指定复制到哪一个新索引. 参考:http://hi.baidu.com/flikecn/item/e82e14bef06e8a ...

  6. Python核心编程——Chapter15

    正则表达式在脚本语言里是最重要的一部分,这部分的题目真的不容怠慢. 开始这部分的题目的解答! 15.1识别下列字符串:bat,bit,but,hat,hit和hut. >>> imp ...

  7. 【leetcode 简单】 第一百一十二题 重复的子字符串

    给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成.给定的字符串只含有小写英文字母,并且长度不超过10000. 示例 1: 输入: "abab" 输出: True 解释 ...

  8. 常见踩坑案例(二)-Request method 'POST' not supported

    一 前言 最近涉及到与前后端的数据对接,按道理来说没一点压力结果被一前端童鞋带坑里去了(不过也是很久没写过这种前后端分离进行联调的事情了,如果是一个人全套弄的话就不会出现下面问题). 二 Reques ...

  9. Bresenham直线算法与画圆算法

    在我们内部开发使用的一个工具中,我们需要几乎从 0 开始实现一个高效的二维图像渲染引擎.比较幸运的是,我们只需要画直线.圆以及矩形,其中比较复杂的是画直线和圆.画直线和圆已经有非常多的成熟的算法了,我 ...

  10. Spring4笔记6--Spring与AOP

    Spring与AOP: AOP的引入: 主业务经常需要调用系统级业务(交叉业务),如果在主业务代码中大量的调用系统级业务代码,会使系统级业务与主业务深度耦合在一起,大大影响了主业务逻辑的可读性,降低了 ...