• 在android studio中集成javah, ndk-build进行JNI开发


    最近在搞一个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。

  • 相关阅读:
    poj3613 Cow Relays【好题】【最短路】【快速幂】【离散化】
    poj1734 Sightseeing trip【最小环】
    poj1094 Sorting It All Out【floyd】【传递闭包】【拓扑序】
    BZOJ2200 道路和航线【好题】【dfs】【最短路】【缩点】
    CH6101 最优贸易【最短路】
    poj3662 Telephone Lines【最短路】【二分】
    codeforces#514 Div2---1059ABCD
    进阶指南---基本算法【阅读笔记】
    hdu5954 Do not pour out【积分】【二分】【待补.....】
    mariadb yum安装
  • 原文地址:https://www.cnblogs.com/lao-liang/p/9418818.html
Copyright © 2020-2023  润新知