近期项目中须要调用c/c++的实现,Android是支持JNI的。所以体验了一下JNI的全过程

1. 前期环境准备

(1) 下载NDK,网址是https://developer.android.com/ndk/downloads/index.html。 国内用户须要FQ。

眼下官网上mac版最新的是android-ndk-r10e-darwin-x86_64.bin。 文件比較大,300多M。

下载下来后,解压到对应文件夹,备用。

解压命令例如以下:

ndk$ chmod a+x android-ndk-r10c-darwin-x86_64.bin

ndk$ ./android-ndk-r10c-darwin-x86_64.bin

解压后在原文件夹会生成一个新的文件夹(android-ndk-r10e), 里面即是NDK的各种工具。





windows系统应该是能够直接用7zip或者zip工具解压,生成一个包括NDK环境的目录。 都比較简单。

(2) 设置NDK环境变量

跳转到用户文件夹下,打开.bash_profile文件

cd ~

touch .bash_profile

open -e .bash_profile

加入例如以下:

export NDK_ROOT=/Users/your_account/.../android-ndk-r10e





source .bash_profile 

然后重新启动terminal, 输入ndk-build, 应该会输出一大堆的信息。





类似以下的信息:

MacBook-Pro:~$ndk-build

Android NDK: Could not find application project directory !    

Android NDK: Please define the NDK_PROJECT_PATH variable to point to it.    

/Users/xxxxx/android-ndk-r10e/build/core/build-local.mk:143: *** Android NDK: Aborting    .  Stop.





这样前期的环境准备就完毕了。

2. JNI的编写





这是官网上一篇介绍JNI的文章, http://developer.android.com/training/articles/perf-jni.html。

里面有提到怎样调用JNI的方法,

以及怎样在JNI中訪问java的对象或者方法或者属性。 这里就不具体介绍了。





在Android Studio中,在响应的java代码的地方写好native的方法。

接着就是要生成c的头文件,须要用到javah命令,首先cd到source文件夹文件夹下。android studio中的文件夹是src/main/java





调用javah生成头文件,调用方法例如以下:





javah -classpath /Users/....../sdk/platforms/android-21/android.jar:. -d jni com.test.native.nativeUtils





运行完没有问题的话,会在同文件夹生成jni文件夹。里面包括了生成的c的头文件。

须要注意的两点。 classpath的最后有:., 第二点是java的class名称,用.替代文件夹分隔符。

3. 编写JNI程序,这个没啥说的,就是c或者c++程序。





4. 编写Android.mk和Application.mk

相同的。android官网提供了非常多的帮助性文档 

https://developer.android.com/ndk/guides/android_mk.html





https://developer.android.com/ndk/samples/sample_na.html#apm





简略例如以下:

生成的so的名字,相同也是在java中loadlibrary中的名字。

LOCAL_SRC_FILES 指定了编译的源码的文件名称,能够指定多个





LOCAL_MODULE    := native-test





LOCAL_SRC_FILES := main.c





LOCAL_LDLIBS    := -llog -landroid -lEGL -lGLESv1_CM





然后编写Application.mk, 指定最小支持的api level等属性





APP_ABI := all

APP_PLATFORM:= android-21

APP_OPTIM := release





5. 生成so文件

最后ndk-build命令。会生成各种格式的so文件。 大功告成。





6. 在java程序中载入生成的so文件。





static {

loadLibrary("native-test");

}

Android Studio JNI体验的更多相关文章

  1. Android Studio JNI开发入门教程

    Android Studio JNI开发入门教程 2016-08-29 14:38 3269人阅读 评论(0) 收藏 举报  分类: JNI(3)    目录(?)[+]   概述 在Andorid ...

  2. Android Studio JNI 开发简单案例

    转载:http://www.androidchina.net/5744.html 进程保活,热修复,硬件接入等等都需要底层的支持,而底层代码是 C .C++ 写的,那么在 Android 中怎么调用底 ...

  3. Android Studio Jni 环境搭建

    第一步:NDK环境搭建,点击下图红色框区域查看NDK下载和环境配置 安照正常情况是很慢的或者无法下载成功的,这个时候可以去下载NDK压缩包进行解压.下面给出两个下载地址 (1)官网:http://we ...

  4. Android Studio JNI/NDK 编程(二) Windows 下环境搭建 demo 开发

    环境 windows 8  (注:其实 Linux 开发可能更方便) Android Studio 2.1; 一 . 下载 安装android-ndk开发包 地址:链接:http://pan.baid ...

  5. 实现Android Studio JNI开发C/C++使用__android_log_print输出Log

    相信很多人在刚开始学习Android JNI编程的时候,需要输出Log,在百度Google搜索的时候都是说需要在Android.mk中加入LOCAL_LDLIBS+= -L$(SYSROOT)/usr ...

  6. android studio JNI使用

    Step: 1. 添加native接口注意写好native接口和System.loadLibrary()即可了,并无特别之处. Step: 2.执行Build->Make Project 生成了 ...

  7. android studio jni调用入门

    一.开发环境配置: 1.Android Studio 2.3.3 2.android-ndk-r14b-windows-x86_64 二.创建项目 1.新建android项目 2.新建文件 3.编译生 ...

  8. 【OpenCV for Android】Android Studio JNI和NDK配置及采坑记录

    在配置好Android studio的OpenCV环境后,我们就可以通过Java代码调用OpenCV的API了,但是在通常情况下,用Java代码编写图像处理算法的运行效率是没有C++代码高的,在应用层 ...

  9. Android studio jni

    首先我们要明确几个概念,jni,ndk,共享库(.so). jni是java native interface的缩写,java 本地接口.它提供了若干的API实现了Java和其他语言的通信(主要是C/ ...

随机推荐

  1. js获取当地时间并且拼接时间格式的三种方式

    js获取当地时间并且拼接时间格式,在stackoverflow上有人在问,查了资料,各种方法将时间格式改成任意自己想要的样式. 1. var date = new Date(+new Date()+8 ...

  2. HDU 4418 高斯消元法求概率DP

    把两种状态化成2*n-2的一条线上的一种状态即可.很容易想到. 高斯列主元法,不知为什么WA.要上课了,不玩了...逃了一次课呢.. #include <iostream> #includ ...

  3. xpee.vbs

    xpee.vbs Win 8安装之后每一次重启桌面都会有一个360浏览器的快捷方式,终于找到原因了, 在Windows/System下面有这么个文件: Set ws = CreateObject(&q ...

  4. React-Native系列Android——Native与Javascript通信原理(一)

    React-Native最核心的是Native与Javascript之间的通信,并且是双向通信.Native层到Javascript层,Javascript层到Native层.虽说是两个方向,但实现上 ...

  5. [nginx]第一篇

    世界太大,我无法安心学习,决定看一个简单的. nginx-1.11.9的代码是nginx-0.5.38的两倍,决定看前者的. 阅读工具:UnderStand 3.1. 入口在nginx.c的195行. ...

  6. ES6 | class类的基本语法总结

    类和模块的内部,默认就是严格模式,所以不需要使用use strict指定运行模式.只要你的代码写在类或模块之中,就只有严格模式可用. 考虑到未来所有的代码,其实都是运行在模块之中,所以 ES6 实际上 ...

  7. 重温前端基础之-js排序算法

    javascript数组常用的方法: push():返回值,数组新的长度 pop():返回值,被删除的数组末尾元素 shift():返回值,被删除的数组首部元素 unshift():返回值,数组新的长 ...

  8. 乌班图 之 Ubuntu 16.04 LTS连接无线上网炒鸡慢问题!!!

    用VMware装了Ubuntu 16.04 LTS后连接无线上网,发现出奇的慢. 果断感觉有问题,立马找度娘,果然有问题!!! 网上查找亲测有效的方法为: 在终端运行:sudo gedit /etc/ ...

  9. MySQL学习(一)——启动和登录MySql遇到的问题及解决

    1.MySQL使用命令行启动时报错“发生系统错误 5”,如下: 原因:未用管理员身份运行cmd程序 解决方案:在开始菜单里找到命令提示符,右击选择以管理员身份运行 2.登录时报错“提示mysql不是内 ...

  10. proxy in java

    [Static] IFeature.java ImpicateF.java Runport.java StaticProxy.java IFeature.java package UProxy.sta ...