前言

这边Android作为日常记录,虽然破坏了文章队形~   最近人工智能挺火的,也稍微了解了一些库,比如关于视觉库openCV。要在安卓下调用这些C/C++库,需要用到JNI开发,在此把过程分享一下。

概念

JNI:Java Native Interface的缩写。提供了API供java和其他语言通信,主要是C/C++。

NDK:Native Development Kit,是 Android的一个工具开发包 ,快速开发C、 C++的动态库,并自动将so文件和应用一起打包成 APK。

JNI和NDK关系:在Android中通过NDK,使用JNI与本地Java代码交互。

分析

分析要做的事情

1、配置NDK环境。(这里用的安卓开发工具是Android studio,as的配置就不细说了)

2、编写C/Cpp文件。

3、编译生成so文件供原生安卓调用。

4、编写本地native方法。

配置NDK环境

方式一:在线配置

  • 打开sdk manager
  • 点击sdk tools
  • 勾选CMake、LLDB、NDK,点击install。

慢慢等吧......顺利的话下载完点击APPLY--->OK,那么恭喜。如果提示下载失败,很大可能是没掌握科学上网=。=!!,此时可以试试方式二。

方式二:离线安装

  • 下载NDK离线安装包并解压,修改文件夹名字为ndk-bundle,放在你安装Android studio的sdk目录下,重启android studio就可以了。(推荐下载地址AndroidDevTools.com,资源较为干净放心)
  • 不想放在sdk目录下的可以解压到任何一个盘,点击android studio --> file --> project structure --> SDK location --> Android NDK Location设置ndk目录,重启android studio。

关联NDK与项目:

1、gradle --> local.properties -->添加配置 ndk.dir=/Users/susan/Android/sdk/ndk-bundle。  (一般情况下这句是自动加上的,假如你的ndk在sdk目录下)

2、gradle --> gradle.propertiess -->添加配置 android.useDeprecatedNdk=true。 (一般情况下也是自动加的)

3、在gredle.build中添加ndk节点。

4、创建本地ImgFun.cpp文件,注意位置位于jni文件夹中。

# include <jni.h>
# include <stdio.h> extern "C"
{
/*表示返回一个字符串 方法名称格式:Java_包名_类名_方法名(这个方法名java要调用的)
*参数
*1. JNIEnv:代表了VM里面的环境,本地的代码可以通过该参数与Java代码进行操作
   *2. obj:定义JNI方法的类的一个本地引用(this)
  */ 

    JNIEXPORT jstring JNICALL Java_com_hong_demo_MyNative_getInfo(JNIEnv *env, jobject obj ){ 
return env -> NewStringUTF("Hello,树先生!");
}
}

5、jni文件夹下创建Android.mk文

LOCAL_PATH :=  $(call my-dir)
// 设置工作目录,而my-dir则会返回Android.mk文件所在的目录
include $(CLEAR_VARS)
// 清除几乎所有以LOCAL——PATH开头的变量(不包括LOCAL_PATH)
LOCAL_MODULE := hello_jni
// 设置模块的名称,即编译出来.so文件名
// 注,要和上述步骤中build.gradle中NDK节点设置的名字相同
LOCAL_SRC_FILES := test.cpp
// 指定参与模块编译的C/C++源文件名
include $(BUILD_SHARED_LIBRARY)
// 指定生成的静态库或者共享库在运行时依赖的共享库模块列表。

6、jni文件夹下创建Application.mk文件

APP_ABI := armeabi armeabi-v7a
// 最常用的APP_ABI字段:指定需要基于哪些CPU平台的.so文件
// 常见的平台有armeabi x86 mips,其中移动设备主要是armeabi平台
// 默认情况下,Android平台会生成所有平台的.so文件,即同APP_ABI := armeabi x86 mips
// 指定CPU平台类型后,就只会生成该平台的.so文件,即上述语句只会生成armeabi平台的.so文件

7、编译生成so文件。控制终端进入jni目录,执行 ndk-build 命令即可。

8、本地调用so文件中的方法。

// 步骤1:加载生成的so库文件
// 注意要跟.so库文件名相同
static {
System.loadLibrary("ImgFun");
}
// 步骤2:定义在JNI中实现的方法
public native String getInfo();

9、整体代码结构

                

最后说明,有几点参考的文章: https://www.jianshu.com/p/38859f881888   质量和画风都非常赞呢~

Android之NDK环境配置+JNI开发+so文件编译的更多相关文章

  1. Android Studio NDK环境配置

    本文参考:Android Studio NDK环境配置及JNI使用方法:http://blog.csdn.net/tongseng/article/details/53005123 并添加自己的实践: ...

  2. android studio ndk 环境配置成eclipse模式

    gradle.properties: android.useDeprecatedNdk=true build.gradle: android { ... sourceSets.main { jni.s ...

  3. android ndk环境配置(转)

    转载自:http://jingyan.baidu.com/article/3ea51489e7a9bd52e61bbac7.html android sdk 更新到 r23 时,eclipse 自带 ...

  4. Delphi使用android的NDK是通过JNI接口,封装好了,不用自己写本地代码,直接调用

    一.Android平台编程方式:      1.基于Android SDK进行开发的第三方应用都必须使用Java语言(Android的SDK基于Java实现)      2.自从ndk r5发布以后, ...

  5. Android NDK环境配置

    之前做了一个基于ffmpeg的软解播放器,熟悉了NDK开发的配置环境过程,但是由于太忙一直没有时间写笔记. 首先,介绍一下在这里所参与协作的软件包: 1. JDK: 这个软件被Eclipse依赖. 2 ...

  6. Android 新版NDK环境搭建(免Cygwin)

    使用最新ndk,直接抛弃cygwin,以前做Android的项目要用到NDK就必须要下载NDK,下载安装Cygwin(模拟Linux环境用的),下载CDT(Eclipse C/C++开发插件),还要配 ...

  7. NDK环境配置

    1.下载安装插件:com.android.ide.eclipse.ndk_23.0.2.1259578.jar      copy到E:\eclipse\adt-bundle-windows-x86- ...

  8. ADT-bundle(Android Development Tools)环境配置

    Android开发环境有两套比较主流的:ADT-bundle和Android Studio,前者是Eclipse插件的形式进行开发,后者是Android的官方IDE. ADT环境的配置与调试:(1)安 ...

  9. Android + Eclipse + PhoneGap 环境配置

    用了3天的时间,终于把环境搭建完毕,郁闷了N天,终于完成了.这里我只是讲述我安装的过程,仅供大家参考. 环境搭建首先要去下载一些安装包: (下载前注意一下,电脑是32位还是64位的请注意选择安装包) ...

随机推荐

  1. Es6 类class的关键 super、static、constructor、new.target

    ES6引入了Class(类)这个概念,作为对象的模板,通过class关键字,可以定义类.基本上,ES6的class可以看作只是一个语法糖,它的绝大部分功能,ES5都可以做到,新的class写法只是让对 ...

  2. c常用函数

    一.strtol long int strtol(const char *nptr, char **endptr, int base) strtol()会将nptr指向的字符串,根据参数base,按权 ...

  3. Windows下部署安装Docker

    好长时间没用Docker,最近准备部署一下,做个记录,今天早上去官网下载,发现Docker开始区分Docker Community Edition(社区版)和Docker Enterprise Edi ...

  4. c#开发Android初学(一)

    我也是最近开始学习用c#开发android,最近找在好心网友那里下到了四个android开发安卓的视频(传智的)有想要的朋友可以留下邮箱 废话不多收,分享我最近一个星期的成果. 先看最主要的一个获取数 ...

  5. python并发学习总结

    目录 一.理解操作系统 二.任务类型 三.Socket模块 四.一个简单的C/S程序 五.使用阻塞IO实现并发 方案一:阻塞IO+多进程 方案二:阻塞IO+多线程 阻塞IO模型的思考和总结 六.使用非 ...

  6. 修改Eclipse jdk环境

    原因:由于项目原因,要将原有的工程从jdk1.6迁移到jdk1.7 问题:Eclipse默认的jdk环境为jdk1.6 解决方法: 1)首先是安装jdk1.7,以及配置环境变量,在这里就不再说了 2) ...

  7. jni使用javap查看java类方法签名

    在Jni开发中,需要回调给java层数据,因此使用java的方法签名是必不可少的. 快速定位java方法签名的方式: java方法签名由(函数参数列表)返回值组成. cmd运行:javap -s 字节 ...

  8. MYSQL数据库的日志文件

    日志文件:用来记录MySQL实例对某种条件做出响应时写入的文件.如错误日志文件.二进制日志文件.慢查询日志文件.查询日志文件等. 错误日志 show variables like 'log_error ...

  9. Integer 与 int -- 自动装箱(autoboxing)与自动拆箱(unboxing)

    转载于 http://www.ticmy.com/?p=110 jdk1.5引入了自动装箱(autoboxing)与自动拆箱(unboxing),这方便了集合类以及一些方法的调用,同时也使初学者对其感 ...

  10. TypeScript的简单介绍和win环境安装

    TypeScript是一种由微软开发的自由和开源的编程语言.它是JavaScript的一个超集,而且本质上向这个语言添加了可选的静态类型和基于类的面向对象编程.特点是一门强类型语言. 安装: 1 首先 ...