Android studio下的DNK开发JNI详解流程
什么是NDK(android native develop kits ):android 本地开发工具集 ,可以把c/c++ ->编译成一个 linux下可以执行的二进制文件 java代码里面就可以通过jni 调用执行二进制的文件.
什么是JNI :java本地开发接口,JNI是一个协议这个协议用来沟通java代码和外部的本地代码(c/c++).通过这个协议,java代码就可以调用外部的c/c++,代码外部的c/c++代码也可以调用java代码。
JNI开发用途:驱动开发 (wifi-hotspot) 2.3无线热点共享 ,Native code效率高,数学运算,实时渲染的游戏上,音视频处理(极品飞车,opengl,ffmpeg),复用代码(文件压缩,人脸识别…)等。
第一步
查看File-->Project Structure-->SDK Location 中第三行 Android NDK location 例如(D:\sdk\ndk-bundle)
可以在local.properties中看到
ndk.dir=D\:\\sdk\\ndk-bundle
sdk.dir=D\:\\sdk
第二步
然后build--Make Project 可以在app/build/intermediates/classes/debug/com/ontim/hellojni/看到MainActivity.class文件)
3、生成头文件,我们要用的命令是javah -d <dir> -classpath <path>
javah是生成jni头文件的命令; -d是生成的头文件存放的目录(这个目录如果事先没有建立,那么运行成功会自动新建); <dir>是前面-d选项的目录名称,如果目录是src的话,不要写成<src>!!,直接写src就好; -classpath从中加载类的路径命令; <path>是需要生成头文件的class文件的目录。
打开studio的Terminal --》 cd app/src/main中执行如下
javah -d jni -classpath D:\sdk\platforms\android-24\android.jar;..\..\build\intermediates\classes\debug com.ontim.hellojni.MainActivity
如果提示缺少指定类,缺少v4包,缺少v7包,则用下边最全的(把sdk路径换成自己的,最后的class文件报名改为自己的..\..\build\intermediates\classes\debug com.ontim.hellojni.MainActivity指的是你的class文件);
javah -d jni -classpath D:\sdk\platforms\android-24\android.jar;D:\sdk\extras\extras\android\support\v4\android-support-v4.jar;D:
\sdk\extras\extras\android\support\v7\appcompat\libs\android-support-v4.jar;D:\sdk\extras\extras\android\support\v7\appcompat\libs\android-support-v7-appcompat
.jar;..\..\build\intermediates\classes\debug com.ontim.hellojni.MainActivity
如果出现以下错误(不出现的话最好加上)
Error:Execution failed for task ':app:compileDebugNdk'.> Error: NDK integration is deprecated in the current plugin. Consider trying the new experimental plugin. For details, see http://tools.android.com/tech-docs/new-build-system/gradle-experimental. Set "android.useDeprecatedNdk=true" in gradle.properties to continue using the current NDK integration.
则在fradle.properties中增加
android.useDeprecatedNdk=true
然后就可以在main目录下看到jni文件夹,里面包含.h文件,包含声明方法
4、创建.c文件,用以实现.h头文件中的声明方法
例,一个简单的返回字符串操作方法
- JNIEXPORT jstring JNICALL Java_com_ontim_hellojni_MainActivity_helloFromC
(JNIEnv *env, jobject onj)
{
return (*env)->NewStringUTF(env,"Hello JNI");
}
5 在 jni下创建Android.mk文件
#指定编译的文件夹 指定当前文件目录
LOCAL_PATH := $(call my-dir)
#编译器会定义很多的临时变量,中间变量,最好清空所有的中间变量。
include $(CLEAR_VARS)
#编译出来模块的名称
LOCAL_MODULE := MyLib
# 编译的源代码的名称
LOCAL_SRC_FILES := hello.c
#编译一个动态库,静态库
#静态库 文件名.a 包含所有的函数并且函数运行的依赖,体积大,包含所有的API
#动态库 文件名.so 包含函数,不包含函数运行的依赖,体积小,运行的时候,去操作系统寻找需要的API
include $(BUILD_SHARED_LIBRARY)<pre name="code" class="html">
6 cd 到jni 目录执行ndk-build.cmd会出现
D:\code\HelloJNI\app\src\main\jni>ndk-build.cmd[arm64-v8a] Compile : MyLib <= hello.c[arm64-v8a] SharedLibrary : libMyLib.so[arm64-v8a] Install : libMyLib.so => libs/arm64-v8a/libMyLib.so[x86_64] Compile : MyLib <= hello.c[x86_64] SharedLibrary : libMyLib.so[x86_64] Install : libMyLib.so => libs/x86_64/libMyLib.so[mips64] Compile : MyLib <= hello.c[mips64] SharedLibrary : libMyLib.so[mips64] Install : libMyLib.so => libs/mips64/libMyLib.so[armeabi-v7a] Compile thumb : MyLib <= hello.c[armeabi-v7a] SharedLibrary : libMyLib.so[armeabi-v7a] Install : libMyLib.so => libs/armeabi-v7a/libMyLib.so[armeabi] Compile thumb : MyLib <= hello.c[armeabi] SharedLibrary : libMyLib.so[armeabi] Install : libMyLib.so => libs/armeabi/libMyLib.so[x86] Compile : MyLib <= hello.c[x86] SharedLibrary : libMyLib.so[x86] Install : libMyLib.so => libs/x86/libMyLib.so[mips] Compile : MyLib <= hello.c[mips] SharedLibrary : libMyLib.so[mips] Install : libMyLib.so => libs/mips/libMyLib.so
在app buid.gradle中增加
android { ...defaultConfig { ... ndk { moduleName "MyLib" //指定生成动态库的名称 } } ...}
在mainactivity中使用
static{System.loadLibrary("MyLib");//不要前缀}
public class MainActivity extends Activity {static{System.loadLibrary("MyLib");}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}public native String helloFromC();public void click(View view){String str = helloFromC();Toast.makeText(this, str, Toast.LENGTH_SHORT).show();}}
Android studio下的DNK开发JNI详解流程相关推荐
- Android Studio安装与App开发步骤详解
环境准备 使用的软硬件具体如下: Windows 7 Android Studio 3.3.2[简称:AS,从官网可以下载,或者使用低版本升级:help->check for update] J ...
- android studio下的NDK开发详解
点击右边,选择你解压的NDK,点击应用.这一步将工具包关联到android studio. 在 local.properties 文件中设置ndk的路径: 就是你解压的NDK工具集的路径 我的是 ...
- Android Studio项目中Build.gradlle配置详解
许多对gradlle不了解的宝宝们总是会在配置的过程中遇到一系列的问题,大体都是对gradlle不够了解.所以在此详细说明gradlle中每一项的用处,如下 1. apply plugin: 'com ...
- android工程怎么连手机,android studio与手机连接调试步骤详解
android studio 版本不同连接手机方式有细微的不同,主要方式相似.介绍主要分手机和电脑两部分介绍. 一.手机部分 1.手机端下载一个"一键root权限获取",在安装的过 ...
- Android studio 下 JNI 开发实例
在AS中进行 NDK 开发之前,我们先来简单的介绍几个大家都容易搞懵的概念: 到底什么是JNI,什么是NDK? 何为"交叉编译"? 先看什么是 JNI?JNI 的全称就是 Java ...
- Android Studio 下安卓 jni 开发错误 undefined reference to AndroidBitmap_getInfo
博客: 安卓之家 微博: 追风917 CSDN: 蒋朋的家 简书: 追风917 又掉坑里了 今天开发 uvc,又遇到了坑: 和之前的这个坑类似:Android Studio 下安卓 jni 开发错误 ...
- 26.Android Studio下Ndk开发(ffmpeg导入Android studio以cmake方式编译的过程)
Android studio 2.2开始支持cmake的方式进行jni开发,我在另一篇10.Eclipse下Ndk开发(ffmpeg解码)中写过Eclipse下编译ffmpeg的过程,但是现在几乎没有 ...
- Android Studio下jni应用
最近在将一个小应用从eclipse开发迁移到android studio,程序中有native代码实现,在eclipse是靠Android.mk这么个mk文件来组织编译的,但到android stud ...
- libraries 和android runtime之间的关系,《Android Studio应用开发实战详解》——第1章,第1.3节Android系统架构...
本节书摘来自异步社区<Android Studio应用开发实战详解>一书中的第1章,第1.3节Android系统架构,作者 王翠萍,更多章节内容可以访问云栖社区"异步社区&quo ...
- 《Android Studio应用开发实战详解》——第1章,第1.4节Android和Linux的关系
本节书摘来自异步社区<Android Studio应用开发实战详解>一书中的第1章,第1.4节Android和Linux的关系,作者 王翠萍,更多章节内容可以访问云栖社区"异步社 ...
最新文章
- [JLOI2013]地形生成
- stdarg.h的库函数用法小结
- Linux有问必答:如何检查Linux的内存使用状况
- 11个笑话让你领悟人生
- Spring 获取 request 的几种方法及其线程安全性分析
- 抱歉!我不太会修电脑 | 2018年中国程序员研究报告
- 编译C#和C++共存的解决方案的小结
- mysql 截取json字符串_mysql如何截取一个json字符串?
- 【剑指 offer】(31)—— 连续子数组的最大和(动态规划)
- 微型计算机在机械设计中的应用,浅谈计算机技术在机械设计制造及自动化中的应用.docx...
- 基于Colaboratory平台使用VGGNet网络进行图片分类
- applicationhostconfig
- react轮播图插件_React 基础面试题 - 和你随便聊聊 React
- 霍尔高斯计G81在地磁测量上的运用
- js中 json对象与json字符串相互转换的几种方式
- 关于SBUS信号在单片机中的一些个人理解
- wmv怎么转换成视频mp4
- BMP JPEG 图片转换为矢量图像 ContourTrace
- 网站一直被大流量DDOS攻击,服务器被打死了怎么办?
- 那些你所不知道的结构光技术
热门文章
- 《东周列国志》第六十六回 杀宁喜子鱄出奔 戮崔杼庆封独相
- bugkuCTF—杂项—旋转跳跃
- Echarts 实现环状半圆形饼图
- ajax 返回html不返回json,jQuery ajax调用返回HTML而不是JSON的Ajax响应
- 松翰触摸单片机SN8F5711
- 如何使用计算机远程关闭手机软件,如何用手机远程控制电脑关机
- linux内核态访问串口,linux内核中串口驱动注册过程(tty驱动)[转]
- dnf 台服服务器pvf修改器,求教怎么用pvf修改器自制装备
- 管理:重要性影响力方格
- 计算机发送到桌面快捷方式,win10怎么把计算机放到桌面快捷方式