前言

因为工作需要可能要用到JNI开发,本篇文章就分享一下我在这方面的实践,以前我们使用Eclipse做NDK开发,非常麻烦,需要配cygwin的编译环境,后面NDK功能完善才逐渐简单点,如果想了解Eclipse如何配置NDK编译环境可以参考我以前发表的旧文:

Cocos2d-x 2.2.3 使用NDK配置编译环境
JNI_Android项目中调用.so动态库

Eclipse的如何通过NDK生成so库就不多说了,目前已经不适用于Android开发,建议使用AS进行开发,本篇也是基于AS来进行讲解。

什么是JNI

如果你进行Android开发一段时间还不知道什么是JNI的话,说明你还是初学者,没有理解Java层跟Native层之间是如何交互的。JNI(Java Native Interface的缩写),Java层通过JNI来调用Native层的功能模块,这样做的好处是能消除平台的差异性,避免重复制造轮子。Java的跨平台性也体现在这里。
如何通过JNI调用Native层的c/c++代码,可以参考我的一篇文章:
JNI_最简单的Java调用C/C++代码

注:window的动态库是.dll文件,而Linux下的动态库是.so文件

配置NDK

如果翻不了墙,可以到这里下载相应平台的NDK版本
http://www.androiddevtools.cn/

下载成功之后解压缩,然后配置系统环境变量,拿windows举例:
先新建NDK_HOME

然后再添加到PATH环境变量中

ok,配好之后,直接可以在命令行使用ndk-build命令:

这里提示没有定义NDK_PROJECT_PATH变量,暂且不管,我们后面说。

然后,在Android Studio配置NDK路径:

上面是笔者的路径,具体按你们来配。

至此,NDK环境配置完毕。

定义Native方法

这里创建一个Android项目-JNIDemo,然后定义TestJNI类,代码如下:

package com.devilwwj.jnidemo;/*** Created by wwj_748 on 2016/4/27.15.47*/
public class TestJNI {public native boolean Init();public native int Add(int x, int y);public native void destory();
}

使用javah命令生成.h文件

执行完上面的命令之后,就生成了com_devilwwj_jnidemo_TestJNI.h这个文件:

ok,这样我们就可以进行下一步操作了。

创建jni目录,创建.cpp文件

然后根据.h文件,创建相对应的.cpp文件
com_devilwwj_jnidemo_TestJNI.cpp

//
// Created by wwj_748 on 2016/4/27.
//
#include <stdio.h>
#include <stdlib.h>
#include "com_devilwwj_jnidemo_TestJNI.h"
#include "Add.h"CAdd *pCAdd = NULL;JNIEXPORT jboolean JNICALL Java_com_devilwwj_jnidemo_TestJNI_Init(JNIEnv *env, jobject obj) {if (pCAdd == NULL) {pCAdd = new CAdd;}return pCAdd != NULL;}JNIEXPORT jint JNICALL Java_com_devilwwj_jnidemo_TestJNI_Add(JNIEnv *env, jobject obj, jint x, jint y) {int res = -1;if (pCAdd != NULL) {res = pCAdd->Add(x, y);}return res;}JNIEXPORT void JNICALL Java_com_devilwwj_jnidemo_TestJNI_destory(JNIEnv *env, jobject obj) {if (pCAdd != NULL) {pCAdd = NULL;}}

这里我还需要创建两个文件,CAdd.h和CAdd.cpp:

ok,到目前我们已经完成JNI层的实现了。

创建Android.mk和Application.mk文件

在jni目录下,我们需要创建两个mk文件

Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)LOCAL_MODULE := JNIDemo
LOCAL_SRC_FILES := com_devilwwj_jnidemo_TestJNI.cpp
LOCAL_SRC_FILES += Add.cppinclude $(BUILD_SHARED_LIBRARY)

其中LOCAL_PATH是C/C++代码所在目录,也就是我们的jni目录。
LOCAL_MODULE是要编译的库的名称。编译器会自动在前面加上lib,在后面加上.so。
LOCAL_SRC_FILES是要编译的C/C++文件。

Application.mk

APP_ABI := all

表示生成所有平台的动态库。

配置gradle

在defaultConfig下,配置ndk:

 ndk {moduleName "JNIDemo" // 生成的so名字}

在android标签内配置sourceSets:

 sourceSets {main {jniLibs.srcDirs = ['libs']}}

生成的so文件都在src/main/libs目录下。

完整的gradle配置,可以看源码。

执行ndk-build命令生成所有cpu架构的so库

然后就可以在libs目录下看到所有平台的so库:

至此,完整的so库实践基本完毕,期间遇到任何问题均可留言,欢迎讨论交流。

最后

关于NDK开发so库会有很多坑,本篇博客也只是引大家入门,我们在使用第三方的SDK的时候,就可能会用到别人提供的so库,也可能会遇到使用so库出现问题,有很多原因,可能是提供了不同的cpu架构的so库,在其他平台出现的crash或者是其他问题,相信我们会遇到的问题别人也会遇到,这时候google一下也许能找到解决方案,最后祝生活愉快。


欢迎关注我的公众号:wwjblog

Android Studio制作.so库实践相关推荐

  1. Android Studio制作搜索栏

    Android Studio制作搜索栏 前言 一.何为自定义控件? 二.制作步骤 1.引入布局 2.布局解析 测试 前言 一.何为自定义控件? 系统自带的控件都是直接或间接继承自View的,View是 ...

  2. 物联网控制APP入门专题(四)---使用android studio制作一个控制页面的APP框架

    摘要:上篇文章讲了如何用阿里云IoT Studio快速制作一个网页版的手机端,以及通过第三方平台将这个网页打包成一个APK文件,使它可以安装到手机实现APP的功能.但是使用第三方平台做的APP是需要收 ...

  3. 【Android RTMP】Android Studio 集成 x264 开源库 ( Ubuntu 交叉编译 | Android Studio 导入函数库 )

    文章目录 安卓直播推流专栏博客总结 一. x264 简介 二. x264 交叉编译 三. Android Studio 导入函数库 四. 交叉编译版本 五. GitHub 项目地址 安卓直播推流专栏博 ...

  4. 【Android NDK 开发】Android.mk 配置静态库 ( Android Studio 配置静态库 | 配置动态库与静态库区别 | 动态库与静态库打包对比 )

    文章目录 I . Android Studio 中使用 Android.mk 配置静态库 总结 II . 第三方动态库来源 III . 配置 Android.mk 构建脚本路径 IV . 预编译 第三 ...

  5. 【Android NDK 开发】Android.mk 配置动态库 ( Android Studio 配置动态库 | 动态库加载版本限制 | 本章仅做参考推荐使用 CMake 配置动态库 )

    文章目录 I . Android Studio 中使用 Android.mk 配置动态库 总结 II . 第三方动态库来源 III . 配置 Android.mk 构建脚本路径 IV . 预编译 第三 ...

  6. android studio 导入第三方库的记录

    android studio 导入第三方库的记录.jar包 和 库 一.jar包 1.jar包的话很简单,首先换成project模式,将你要用的jar包复制到lib下面.如图 2.然后右键选择Add ...

  7. android页面布局计算机,Android Studio制作简单计算器App

    Android Studio制作简单计算器App 计算机界面如图: 程序设计步骤: (1)在布局文件中声明编辑文件框EditText,按钮Button等组件. (2)在MainActivity中获取组 ...

  8. Android Studio制作.9图片,看这一篇就够了

    一..9.png图片概念 这是安卓开发里面的一种特殊的图片 这种格式的图片在android 环境下具有自适应调节大小的能力,不会失真 (1)允许开发人员定义可扩展区域,当需要延伸图片以填充比图片本身更 ...

  9. Android studio 更新aar库无效问题解决

    Android studio 更新aar库无效问题解决 前言 清缓存 解决 完事 前言 最近开发库的时候带有关联库,也就是每个SDK都依赖了中间的SDK.在我修改了中间SDK的时候,打包成aar,放到 ...

最新文章

  1. 结课作业:云计算在物联网中的应用发展
  2. MATLAB对函数做评估
  3. java白盒测试面试题_面试之JAVA基础Junit了解
  4. Dalvik 虚拟机操作码
  5. C++-十进制转二进制(matlab-dec2bin函数)
  6. Android多媒体学习一:Android中Image的简单实例。
  7. 学习Java的9张思维导图
  8. Eclipse安装包下载慢解决方法
  9. 计算机无法播放flash,电脑中已安装Flash网页视频还是提示未安装Flash播放器怎么办...
  10. stm32 Ctext-M3内核最简单的多任务RTOS
  11. 平板电脑可以用手写的计算机软件,手写平板电脑哪款好 手写平板电脑有哪些推荐...
  12. 3、线性表的顺序存储结构(顺序表)
  13. 实用!四个方法训练自己的设计思维
  14. openjudge 1.3.10 计算并联电阻的阻值
  15. 蜘蛛大战之 站点LOGO(SEO)
  16. Intel.VTune.Performance.Analyzer.v8.0.014.ISO下载
  17. 解决问题:CA_ERROR证书出错,请登录微信支付商户平台下载证书-企业付款到零钱接口(原创)
  18. android hide方法 末班,Android调用@hide系统隐藏类的几种方法
  19. Python模块、包与面向对象综合案例
  20. Debian7.1下Broadcom 4312无线网卡驱动安装

热门文章

  1. B5G毫米波通信无线接入网络的架构设计
  2. docker技术学习流程
  3. 计算机网络题简单建设校园网络,计算机网络课程设计—校园网络构建方案设计和实现.doc...
  4. flex---布局神器,无往不利
  5. 入职后端程序员的一些心得
  6. 推荐算法的多模型融合
  7. maven的settings.xml文件
  8. 需要跟前辈学习的博客
  9. 大型会议的礼仪(2)
  10. Spring Security安全机制