Android学Jni/Ndk 开发记录(一)
治疗拖延症的唯一办法就是:一想起些什么 / 要做些什么就 TM 立马去做!
是的,突然想起我不会 JNI、NDK 开发。解决办法:立马去学!
一:配置 NDK 环境
- 下载 NDK
- 写入到配置文件
二:理解分层
三部分:
- Java 上层
- JNI 桥梁
- 底层(C or C++)
三:代码开发(以一个计算器为 DEMO)
Java 上层定义好native
方法:
1 |
public class CalculatorHelper { static { |
新建Calculator.hpp
文件,提供算法的底层,使用 C++ 实现:
1 |
#ifndef JNITEST_CALCULATOR_HPP |
新建Calculator.cpp
文件,具体算法实现 :
1 |
#include "Calculator.hpp" int add(int a, int b){ |
上层和底层都已经准备好了,只欠一个桥梁 JNI
JNI 实现过程:
编译CalculatorHelper.java
生成.class
文件,-d 指生成的目录
1 |
javac src/main/java/com/baitu/jnitest/CalculatorHelper.java -d src-gen/ |
根据CalculatorHelper.class
生成.h
文件:
1 |
javah -classpath src-gen/ -d jni/ com.baitu.jnitest.CalculatorHelper |
生成的.h
文件:
1 |
/* DO NOT EDIT THIS FILE - it is machine generated */ |
新建CalculatorUtils.hpp
,把刚.h
文件的代码拷贝过去,新建CalculatorUtils.cpp
,JNI 具体实现:
1 |
#include "CalculatorUtils.hpp" |
#include "Calculator.cpp"
引用底层,然后调用其相关算法方法:add(a, b)
,sub(a, b)
,完成 JNI 与 底层 交互。
到这里,JNI 已经编写完成。
配置两个 NDK 编译时的配置文件:Android.mk
:
1 |
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := calculator |
Application.mk
:
1 |
APP_ABI := all |
在 jni(存放 JNI 文件的文件夹必须命名为 JNI)的父目录运行命令:
1 |
ndk-build |
然后会看到在同级目录下会创建一个 libs 文件夹,里面生成一堆 so 库,把它们拷贝到项目的 so 库目录下即可。
最后在 Java 调用 native 方法:
1 |
int a = 5; |
欧耶!完成 Java - JNI - C++ 调用!
推荐:
Android NDK开发环境搭建
Android学Jni/Ndk 开发记录(一)的更多相关文章
- android Jni NDK开发环境搭建及其简单实例的编写
android Jni NDK开发环境搭建及其简单实例的编写 由于工作需要,需要采用开发想要的JNI,由于之前没有接触过安卓的开发,所以更加网上的帖子,学习了下.遇到了些问题,然后总结下学习过程中 ...
- Android JNI/NDK开发教程
JNI/NDK开发指南:http://blog.csdn.net/xyang81/article/details/41759643
- JNI/NDK开发
公司的新需求终于解决完了,离测试和发布还有段时间,第一次体验了下没需求没bug的感觉,真是舒爽~然后翻了翻有什么可以学的.无意翻到了Android后期发展的五大趋势.一.性能优化.二.高级UI.三.J ...
- JNI/NDK开发指南(开山篇)
转载请注明出处:http://blog.csdn.net/xyang81/article/details/41759643 相信很多做过Java或Android开发的朋友经常会接触到JNI方面的技术, ...
- AS2.2使用CMake方式进行JNI/NDK开发
之前写过一篇比较水的文章Android手机控制电脑撸出HelloWorld 里面用到了JNI/NDK技术. 这篇文章给大家介绍下JNI/NDK开发.采用的是Android Studio2.2开发环境, ...
- Android JNI(NDK)开发总结
早就知道Java有个jni可以调用本地化代码,一直没有动力去研究它,现在公司想通过在Android中调用本地化代码来申请较多的内存以突破Android对单个进程的内存限制,这确实是可行的:我的Nexu ...
- Android Native 代码NDK开发学习笔记
引用:http://www.kunli.info/2011/08/21/android-native-code-study-note/ JNI,全称Java Native Interface,是用于让 ...
- Android -- Android下的NDK开发(一)
1,NDK是什么?为什么要进行NDK开发? NDK:Native Development Kit.Android应用运行在Dalvik虚拟机中.NDK允许开发人员使用本地代码语言(例如C和C++)实现 ...
- 使用Android Studio进行ndk开发的准备
1. gradle-ex2. ndk开发包3. 项目目录结构4. lldb调试器 1. 一般来说gradle不是必需的,gradle也是可以进行ndk编译的,然而你需要在编译时使用更多(多于一个)c+ ...
随机推荐
- 软件工程概论课堂测试一————添加新课程(web)
设计思想 三个文件Class_add.java add.jsp addInput.jsp Class_add.java : 内封装方法:连接数据库.向数据库添加课程信息.判断非合理的输入情况.判断 ...
- 解决IDEA2018.1.5或者Android Studio 3.0版本的输入法不跟随光标问题
问题1:IDEA2018.1.5版本的输入法不跟随光标 解决办法1:修改JDK版本,步骤如下: 1. 使用快捷键ctrl+shift+A,在输入框中输入Switch Boot JDK,如图所示 2.替 ...
- RabbitMQ-Java客户端API指南-上
RabbitMQ-Java客户端API指南-上 客户端API严格按照AMQP 0-9-1协议规范进行建模,并提供了易于使用的附加抽象. RabbitMQ Java客户端使用com.rabbitmq.c ...
- Scala 基础(5)—— 构建函数式对象
有了 Scala 基础(4)—— 类和对象 的前提,现在就可以来构建一个基于 Scala 的函数式对象. 下面开始构造一个有理数对象 Rational. 1. 主构造方法和辅助构造方法 对于每一个类的 ...
- [bzoj1798][Ahoi2009]Seq 维护序列seq ([洛谷P3373]【模板】线段树 2)
题目大意:有$n$个数,有$m$个操作,有三种: $1\;l\;r\;x:$把区间$[l,r]$内的数乘上$x$ $2\;l\;r\;x:$把区间$[l,r]$内的数加上$x$ $3\;l\;r:$询 ...
- 论文笔记《Deep Hand: How to Train a CNN on 1 Million Hand Images When Your Data Is Continuous and Weakly Labelled》
一.概述 这个是最近的核心工作了,基本上都是靠着这篇paper的model过日子了啊.. 论文主要讲的是hand gesture recognition,实际上是用googlenet做的一个class ...
- 8.2 前端检索的敏感词过滤的Python实现(针对元搜索)
对于前端的搜索内容进行控制,比如敏感词过滤,同样使用socket,这里使用Python语言做一个demo.这里不得不感叹一句,socket真是太神奇了,可以跨语言把功能封装,为前端提供服务. 下面就是 ...
- bzoj 4443 [Scoi2015]小凸玩矩阵 网络流,二分
[Scoi2015]小凸玩矩阵 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1564 Solved: 734[Submit][Status][Di ...
- Disable or enable the IPv6 protocol in Red Hat Enterprise Linux
Resolution Red Hat Enterprise Linux 4, 5 and 6 enable Internet Protocol Version 6 (IPv6) by default. ...
- Java并发(1)- 聊聊Java内存模型
引言 在计算机系统的发展过程中,由于CPU的运算速度和计算机存储速度之间巨大的差距.为了解决CPU的运算速度和计算机存储速度之间巨大的差距,设计人员在CPU和计算机存储之间加入了高速缓存来做为他们之间 ...