治疗拖延症的唯一办法就是:一想起些什么 / 要做些什么就 TM 立马去做!

是的,突然想起我不会 JNI、NDK 开发。解决办法:立马去学!


一:配置 NDK 环境

  • 下载 NDK
  • 写入到配置文件

二:理解分层

三部分:

  • Java 上层
  • JNI 桥梁
  • 底层(C or C++)

三:代码开发(以一个计算器为 DEMO)

Java 上层定义好native方法:

1
2
3
4
5
6
7
8
9
public class CalculatorHelper {

    static {
System.loadLibrary("calculator");
} public native static int add(int a, int b);
public native static int sub(int a, int b);
}

新建Calculator.hpp文件,提供算法的底层,使用 C++ 实现:

1
2
3
4
5
6
7
8
9
10
#ifndef JNITEST_CALCULATOR_HPP
#define JNITEST_CALCULATOR_HPP class Calculator {
int add(int a, int b); int sub(int a, int b);
}; #endif //JNITEST_CALCULATOR_HPP

新建Calculator.cpp文件,具体算法实现 :

1
2
3
4
5
6
7
8
9
#include "Calculator.hpp"

int add(int a, int b){
return a + b;
} int sub(int a, int b){
return a - 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_baitu_jnitest_CalculatorHelper */ #ifndef _Included_com_baitu_jnitest_CalculatorHelper
#define _Included_com_baitu_jnitest_CalculatorHelper
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_baitu_jnitest_CalculatorHelper
* Method: add
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_baitu_jnitest_CalculatorHelper_add
(JNIEnv *, jobject, jint, jint); /*
* Class: com_baitu_jnitest_CalculatorHelper
* Method: sub
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_baitu_jnitest_CalculatorHelper_sub
(JNIEnv *, jobject, jint, jint); #ifdef __cplusplus
}
#endif
#endif

新建CalculatorUtils.hpp,把刚.h文件的代码拷贝过去,新建CalculatorUtils.cpp,JNI 具体实现:

1
2
3
4
5
6
7
8
9
10
11
12
#include "CalculatorUtils.hpp"
#include "Calculator.cpp" JNIEXPORT jint JNICALL Java_com_baitu_jnitest_CalculatorHelper_add
(JNIEnv *env, jobject thiz, jint a, jint b){
return add(a, b);
} JNIEXPORT jint JNICALL Java_com_baitu_jnitest_CalculatorHelper_sub
(JNIEnv *env, jobject thiz, jint a, jint b){
return sub(a, b);
}

#include "Calculator.cpp" 引用底层,然后调用其相关算法方法:add(a, b)sub(a, b),完成 JNI 与 底层 交互。

到这里,JNI 已经编写完成。

配置两个 NDK 编译时的配置文件:
Android.mk :

1
2
3
4
5
6
7
8
9
10
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := calculator
LOCAL_SRC_FILES := CalculatorUtils.cpp LOCAL_LDLIBS := -lm -llog include $(BUILD_SHARED_LIBRARY)

Application.mk:

1
APP_ABI := all

在 jni(存放 JNI 文件的文件夹必须命名为 JNI)的父目录运行命令:

1
ndk-build

然后会看到在同级目录下会创建一个 libs 文件夹,里面生成一堆 so 库,把它们拷贝到项目的 so 库目录下即可。

最后在 Java 调用 native 方法:

1
2
3
4
int a = 5;
int b = 3;
CalculatorHelper.add(a, b);
CalculatorHelper.sub(a, b);

欧耶!完成 Java - JNI - C++ 调用!

推荐:

Android NDK开发环境搭建

Android学Jni/Ndk 开发记录(一)的更多相关文章

  1. android Jni NDK开发环境搭建及其简单实例的编写

    android  Jni  NDK开发环境搭建及其简单实例的编写 由于工作需要,需要采用开发想要的JNI,由于之前没有接触过安卓的开发,所以更加网上的帖子,学习了下.遇到了些问题,然后总结下学习过程中 ...

  2. Android JNI/NDK开发教程

    JNI/NDK开发指南:http://blog.csdn.net/xyang81/article/details/41759643

  3. JNI/NDK开发

    公司的新需求终于解决完了,离测试和发布还有段时间,第一次体验了下没需求没bug的感觉,真是舒爽~然后翻了翻有什么可以学的.无意翻到了Android后期发展的五大趋势.一.性能优化.二.高级UI.三.J ...

  4. JNI/NDK开发指南(开山篇)

    转载请注明出处:http://blog.csdn.net/xyang81/article/details/41759643 相信很多做过Java或Android开发的朋友经常会接触到JNI方面的技术, ...

  5. AS2.2使用CMake方式进行JNI/NDK开发

    之前写过一篇比较水的文章Android手机控制电脑撸出HelloWorld 里面用到了JNI/NDK技术. 这篇文章给大家介绍下JNI/NDK开发.采用的是Android Studio2.2开发环境, ...

  6. Android JNI(NDK)开发总结

    早就知道Java有个jni可以调用本地化代码,一直没有动力去研究它,现在公司想通过在Android中调用本地化代码来申请较多的内存以突破Android对单个进程的内存限制,这确实是可行的:我的Nexu ...

  7. Android Native 代码NDK开发学习笔记

    引用:http://www.kunli.info/2011/08/21/android-native-code-study-note/ JNI,全称Java Native Interface,是用于让 ...

  8. Android -- Android下的NDK开发(一)

    1,NDK是什么?为什么要进行NDK开发? NDK:Native Development Kit.Android应用运行在Dalvik虚拟机中.NDK允许开发人员使用本地代码语言(例如C和C++)实现 ...

  9. 使用Android Studio进行ndk开发的准备

    1. gradle-ex2. ndk开发包3. 项目目录结构4. lldb调试器 1. 一般来说gradle不是必需的,gradle也是可以进行ndk编译的,然而你需要在编译时使用更多(多于一个)c+ ...

随机推荐

  1. 软工实践 - 第十一次作业 Alpha 冲刺 (3/10)

    队名:起床一起肝活队 组长博客:https://www.cnblogs.com/dawnduck/p/9972061.html 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去 ...

  2. Linux 网卡特性配置ethtool详解

    近期遇到一个自定义报文传输性能问题,解决过程中借助了ethtool这个工具,因此发掘一下与此工具相关的网卡的一些特性. ethtool 常用命令如下,比如对eth0的操作: ethtool eth0 ...

  3. 再探 KMP 算法

    $\DeclareMathOperator{\fail}{fail}$ KMP 算法堪称经典中的经典,然而这么多年以来,我却未能完全理解这个算法.我对 KMP 算法掌握的程度,是知其原理,但写不出来. ...

  4. [洛谷P1792][国家集训队]种树

    题目大意:给出由$n$个数组成的环,取某个数就可以得到它的分数,相邻的两个数不能同时取.问取$m$个数可以得到的最大分数. 题解:建一个大根堆,贪心取,每个点记录前驱后继,取一个点就把前驱后继设成不能 ...

  5. HDU3605:Marriage Match IV

    Marriage Match IV Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  6. DiskGenius

    DiskGenius是一款集磁盘分区管理与数据恢复功能于一身的工具软件.它即是一款功能强大.灵活易用的分区软件,同时也是一款技术高超.功能全面的数据恢复软件.它不仅具备与分区管理有关的几乎全部功能,支 ...

  7. laravel的elixir和gulp用来对前端施工

    使用laravel elixer npm install --global gulp  ok 然后在安装好的laravel 下 npm install 以安装 laravel-elixir subli ...

  8. Mysql性能优化【转】

    mysql的性能优化无法一蹴而就,必须一步一步慢慢来,从各个方面进行优化,最终性能就会有大的提升. Mysql数据库的优化技术 对mysql优化是一个综合性的技术,主要包括 表的设计合理化(符合3NF ...

  9. 我们曾经心碎的C#之 第一章.我的第一个C#程序

    第一章.      C#入门 1.1        .NET与C#            001..NET是Microsoft.NET的简称,是基于Windows平台的一种技术            ...

  10. HDU 5251 矩形面积(二维凸包旋转卡壳最小矩形覆盖问题) --2015年百度之星程序设计大赛 - 初赛(1)

    题目链接   题意:给出n个矩形,求能覆盖所有矩形的最小的矩形的面积. 题解:对所有点求凸包,然后旋转卡壳,对没一条边求该边的最左最右和最上的三个点. 利用叉积面积求高,利用点积的性质求最左右点和长度 ...