Android NDK : NDK开发概要

Android-NDK开发入门 JNI(JavaNativeInterface英文缩写),译为Java本地接口。是Java众多开发技术中的一门技术,意在利用本地代码,为Java程序提供更高效、更灵活的拓展。尽管Java一贯以其良好的跨平台性而著称,但真正的跨平台非C/C++莫属,因为当前世上90%的系统都是基于C/C++编写的。同时,Java的跨平台是以牺牲效率换来对多种平台的兼容性,因而JNI就是这种跨平台的主流实现方式之一。总之,JNI是一门技术,是Java与C/C++沟通的一门技术。 阅读详情

Android NDK : NDK开发概要

通过NDK可以做什么?

1 . 在java代码中调用C++的库
2.  创建可执行的程序 (不推荐使用NDK来做这个)
3  通过gdb来调试native 程序



由图可以看出,一个java应用是通过JNI来调用本地方法(即C / C++的函数) 。整个Application依然是运行在dalvik虚拟机上的,所以整个Application的生命周期
仍然是android的生命周期,这点并没有改变,但是推荐使用一个小型的 java wrapper 来管理整个Application的生命周期 。 

什么时候需要本地方法?

在有些情况下,你可能需要使用一些本地方法(C / C++ )直接在CPU上跑 ,而不是在虚拟器上跑,此时就需要使用到本地方法。
于是NDK提供给了我们一个工具箱,可以在java应用中来编写和组织本地代码。

在android中使用本地代码的一些特性:

高复杂度的精确地计算 (比如一些复杂图形)
使用NDK提供的一些稳定的依赖库
Java与本地方法的交互应该尽可能少,比如一种理想的情况是使用java应用程序调用计算密集型的本地函数并接收结果,注意java与本地方法
不要作频繁的调用和回调 。

从Android2.3开始我们可以使用NativeActivity来开发无Java代码的android应用开发。

一些常用的API和library



使用NDK 构建 native application



从图中可以看出NDK的构建系统是为了创建C / C++ 的静态库和动态库 

NDK的目录和结构

这里拿最新的NDK来说明 , NDK R10的目录结构 :

打开我们下载好的NDK R10的目录 如下 :


build目录下是一些进行构建的脚本 ,包含 makefiles  awk脚本等 (稍微学过linux的应该都比较熟悉了);
docs目录下是一些文档(html) ,包括如何使用NDK,在eclipse中引入NDK等 ,绝对最好的学习文档 ;
platforms目录下是一些头文件和库
prebuilt目录下是一些对于不同平台下的预编译库
samples目录是一些示例程序,比如你常见的各种 “ hello world ”版本
sources 目录下是源码,链接到应用或库
tests目录下是一些自动化测试NDK的脚本
toolchains目录下是ARM Linux 和 x86的工具链 ( 编译,链接等 )
GNUmakefile 构建NDK的nakefile文件
ndk-build 构建脚本 ,用于构建一个本地应用或者本地库
ndk-gdb gdb调试开始的脚本
ndk-stack 栈追踪分析工具

NDK C++ support

NDK提供了一些基本的C++运行时环境通过默认的库—— /system/lib/libstdc++

使用默认的系统库,有些C++的特性是不支持的:

- C++ exceptions
- RTTI (Run-Time Time Information)
- Standard C++ library



JNI - 在java代码中调用C++ 函数

在Java代码中声明 :

public native String NDKTestFromJNI();// native声明,表示这个方法来自Native层。实现过程已经在native层实现了

C++ / C 代码 :

jstring Java_com_testdnk_testndk_MainActivity_NDKTestFromJNI(JNIEnv* env,
			jobject thiz) {
		 return env->NewStringUTF("Hello NDK!");
	}
注意格式 jstring 为返回值 ,com_testdnk_testndk为包名(即函数声明所在路径名),MainActivity为android活动类 (class名) NDKTestFromJNI为函数名。

SDK project with native code

此时我们来完成我们的第一个android NDK应用 。

首选从官方下载NDK : http://wear.techbrood.com/tools/sdk/ndk/   选择适合自己的版本 。


打开你的eclipse ,配置 NDK的路径  ,window ——> preference 



如果你的eclipse没有 NDK这一项 则请下载jar包 ,然后放在eclipse的 plugins 目录下 再重启eclipse :

jar 包下载 : http://download.youkuaiyun.com/detail/cassiepython/9572228

完成上面这些就可以正式开始我们的Hello NDK 开发了 。新建一个android项目 , 然后在工程项目上点击右键,如图:



输入名称 :



接下来在生成的TestNDK中写入下列代码 :

#include <jni.h>
#include <string.h>
extern "C" {
	jstring Java_com_testdnk_testndk_MainActivity_NDKTestFromJNI(JNIEnv* env,
			jobject thiz) {
		 return env->NewStringUTF("Hello NDK!");
	}
}

然后在项目工程上右键点击 Build Project 来生成库 。



最后 Mainactivity中调用该方法,并将字符串显示在一个TextView中 :

package com.testdnk.testndk;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends Activity {
	
	private TextView textView;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		textView = (TextView) findViewById(R.id.testDNK);
		textView.setText(NDKTestFromJNI());
		
	}

	public native String NDKTestFromJNI();// native声明,表示这个方法来自Native层。实现过程已经在native层实现了
	
    static {
        System.loadLibrary("TestNDK");// 加载库,前面的lib和后缀名不用写
    }
}

运行结果 :




在Clion开发工具上使用NDK编译可以在安卓上执行的程序 在ndk r19版本以前,要在CLion上编译ndk只能采用独立工具链的方式,创建独立工具链供CLion调用。不过r19之后,ndk的默认工具链都是独立工具链了,不需要再创建了。 本文记录在Clion开发工具上使用NDK编译可以在安卓上执行程序的配置步骤。 阅读详情

相关推荐

Android NDK 开发

定义:NDK 是 Android SDK 的补充工具集,用于将 C/C++ 代码编译成.so(Shared Object,共享库)文件,供 Android 应用(Java/Kotlin)调用。核心作用复用现有 C/C++ 代码(如算法库、游戏引擎、硬件驱动)。提升性能敏感场景(如实时渲染、音视频处理、加密计算)的执行效率。访问 Android 平台的底层 API(如 OpenSL ES 音频、OpenGL ES 图形、传感器)。适用场景高性能计算(如数学建模、图像处理)。

weixin_39789947的博客 1071

安装Thiz Linux

http://it.sohu.com/7/0604/58/column220435884.shtml 系统需求   (1)装有Intel Pentium级以上或AMD, Cyrix等X86兼容的电脑;   (2)最小32MB内存,建议使用64MB以上;   (3)...

weixin_33860147的博客 349

如何定位Android NDK开发中遇到的错误

应部分同学要求,把之前的几篇文章合成这个一篇 正式开始这个话题之前,先简单介绍一下什么是NDK和JNI,部分内容来自网络 Android NDK是什么,为什么我们要用NDK? Android NDK 是在SDK前面又加上了“原生”二字,即Native Development Kit,因此又被Google称为“NDK”。众所周知,Android程序运行在Dalvik虚拟机中,N

yincp的专栏 5058

一篇文章教你完全掌握jni技术

通过这样一个简单的案例,将大部分jni相关的API都练习了一遍,不难看出,java层能实现的功能,在native层一样可以实现,但这里仅仅是为了练习jni,实际项目中不会把一些无关紧要的功能写在native层,比如UI操作,因为同样的功能,java代码要简洁得太多。在一些拥有复杂算法的场景(音视频编解码,图像绘制等),java的执行效率远低于C/C++的执行效率,使用jni技术,在java层调用C/C++代码,可以提高程序的执行效率,最大化利用机器的硬件资源。的内容,这个取决于实际的需求。

chuyouyinghe的专栏 3360

安卓NDK开发流程(适合新手学习)

为什么需要用到DNK(也就是jni)?因为安卓有很多功能是实现不了的,尤其是和底层硬件交互的一些操作,比如打印操作,直接用安卓连接底层打印机,就很难实现,但是用C就可以和硬件交互,这个时候就需要用安卓去调用C语音的方法,然后C再和底层硬件交互 OK,言归正传,看一下NDK的简单开发流程(确保自己可以把NDK操作完整地跑一边,就基本上可以明白DNK的作用了) 第一步:下载ndk以及配置ndk路径...

qq_35945801的博客 718

安卓开发中JDK、SDK、NDK、ADT、ANT等概念作用解释

这个是从网上找到的对这几个名词的解释: 主要对初接触的人有用,对多平台开发人员可能记混的也有点作用。 名词解释 很多初接触安卓的朋友在配置开发环境时面对诸如JDK、SDK、NDK、ADT等概念一头雾水不知所以,在这里对这些概念及其相关作用进行解释,希望对初学者有所帮助: IDE :(Integrated Development Environment) 集成开发环境,用于提供程序开发环境的应用程序,即我们编程的地方。一般包括代码编辑器、编译器、调试器和图形用户界面,比如visual studio、X

暴走影视 1866

类名.thi及this区别

this指的是当前正在访问这段代码的对象,当在内部类中使用this指的就是内部类的对象。 为了访问外层类对象,就可以使用外层类名.this来访问,一般也只在这种情况下使用这种形式。 这种用法也用于匿名类。 有时候,我们会用到一些内部类和匿名类。当在匿名类中用this时,这个this则指的是匿名类或内部类本身。这时如果我们要使用外部类的方法和变量的话,则应该加上外部类的类名。如下面这个例子

rongwenbin的专栏 766

避免踩坑!杰理AC63蓝牙名修改常见问题及解决方案(含BLE后缀处理)

本文详细解析了杰理AC63蓝牙设备名称修改的全过程,包括基础操作、BLE后缀处理及高级调试技巧。针对蓝牙名修改中的常见问题,提供了实用的解决方案和代码示例,帮助开发者避免踩坑并实现高效定制。

q6r7s8t9的博客 411

js中,一个js中的函数,第一句var thiz = this; 为什么要这样做?

第一种情况: $("#btn").click(function(){ var _this = this; //这里this和_this都代表了"#btn"这个对象 $(".tr").each(function(){ this;//在这里this代表的是每个遍历到的".tr"对象 _this;//仍代表"#btn"对象 }) })这种

念念不忘丶又怎樣的博客 1878

MounRiver避坑实录:手把手迁移CH32V307 EVT工程到自定义目录

本文详细记录了将沁恒CH32V307的EVT工程迁移到自定义目录的完整流程与避坑指南。针对MounRiver Studio的虚拟链接机制,重点讲解了如何清理旧配置、重新设置头文件路径、链接脚本等关键步骤,帮助开发者创建独立、可维护的MCU项目工程。

uber9的博客 243

PL端:HDMI 输出实验

开发板没有HDMI编码芯片,是将FPGA的3.3差分IO直接连接到HDMI连接器,FPGA 完成 24 位 RGB 编码输出TMDS 差分信号。1、学会使用第三点IP核,首先是添加,后面的使用和自带IP核操作一致。2、主要还是在梳理vivado使用流程。

qq_43441284的博客 4287

Android之NDK开发问题解决办法

Android之NDK开发错误解决办法

冰点蓝欣的专栏 1287

Halcon手眼标定实战:从九点标定到机械臂精准抓取(附完整代码)

本文详细介绍了Halcon手眼标定技术在实际工业场景中的应用,重点讲解了九点标定法在机械臂精准抓取中的实现步骤和优化技巧。通过对比Eye-to-Hand和Eye-in-Hand两种模式的特点,提供完整的代码示例和误差分析,帮助工程师快速掌握标定技术,提升自动化系统的精度和稳定性。

weixin_29100927的博客 459

Android之NDK开发入门

注意:本文操作环境为mac,Android Studio版本3.5 前言 NDK全称Native Development Kit,是Android的一个工具开发包,能够快速开发C,C++的动态库,并自动将so和应用打包成APK。而NDK的使用场景就是通过NDK在Android中使用JNI,那么JNI又是啥呢?JNI全称是Java Native Interface,即Java的本地接口,JNI可以使得Java与C,C++语言进行交互。这么一来,通过NDK和JNI,就可以很方便的在Android的开发环境中.

jsyjst的博客 8034

在天问block环境下LU-ASR01与51单片机的基础运用

正确步骤将模块和电脑连接后,仍然显示未连接(如4.1中图片中的编译下载后面显示未连接),可以尝试关闭软件后尝试,如果仍然不行换一条type-c线再试;以上方式都不行,可能要怀疑ASR01硬件损坏,跟商家联系!!!

BUG7073的博客 1万+

谷粒商城学习笔记-15-数据库初始化

这一节的主要内容是把创建对应的数据库和数据库表。

epitomizelu的专栏 1438

Android之NDK开发初体验

作为Android开发人员,没有接触过NDK开发也接触过so文件吧。其实NDK编程也没有看来的那么隐秘,今天我们来看看咱们利用NDK来写出自己的so文件

stven_king的专栏 8710

STM32(HAL库)软件IIC驱动OLED

本文通过STM32F103C8T6单片机(HAL库)通过软件IIC方式对OLED进行驱动。

weixin_44597885的博客 9761

安卓开发环境搭建JDK + SDK Manager + NDK + Android Studio

第一次接触安卓开发,配置环境就折腾了一晚上。在此分享安装与配置过程,希望可以帮助更多入门开发者。 一、JDK JDK(Java Development Kit) 是整个Java的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工具和Java基础的类库(rt.jar)。 1. 下载 : 官网下载地址 如图(红圈处注意,这里我选择的是8u191,64位,wi...

chengxunyang的博客 4445

MATLAB 开发项目实例 1000 例专栏之第37例:基于Simulink的无人机飞行控制系统设计

通过上述项目实例,我们成功地使用Simulink设计和仿真了一个无人机的飞行控制系统。这个项目展示了从无人机建模、路径规划、控制器设计到仿真验证的完整流程。Simulink的可视化和模块化特性使得系统的建模和仿真更加直观和高效。

xiaoheshang_123的博客 163

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Unity安卓开发最全NDK版本下载指南

Unity安卓开发最全NDK版本下载指南 【下载地址】Unity安卓开发最全NDK版本下载指南 在Unity安卓开发中,正确匹配Native Development Kit(NDK)版本至关重要。不同Unity版本需要特定NDK版本支持,例如Unity2021.3.3f1需NDK 21.3.6528147,而Unity2...

gitblog_06766的博客 912

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

探索高效安卓开发的新边界:Rust与Android NDK的完美融合

在移动开发领域,我们经常寻找那些能够提升性能、保证安全并简化代码管理的技术解决方案。今天,向您推荐一个开源项目——[Rust-NDK](https://github.com/rust-mobile/ndk),这是一个为Rust语言量身打造的Android原生开发工具包接口,它将强大的Rust编程语言与成熟的Android NDK紧密结合,开启了一个全新的开发维度。 ## 项目介绍 Rust-N...

gitblog_00064的博客 935

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

在Android Studio下进行NDK开发

JNI的全称就是Java Native Interface,其实它就是一种协议。一说协议,那它就是对某种东西的一个规范和约束,说的好听一点就是标准化。意思是如果你想用我这个东西,那你必须要遵守我这边的规范。有了JNI这个协议,Java和C/C++代码才能相互调用。NDK全称是Native Development Kit,它就是一个本地开发的“工具包”。Java开发要使用JDK,Android开发要使用SDK,那我们在Android中要进行native开发,也要用到它对应的工具包,即NDK。

leihu007的专栏 2288

windows下eclipse搭建android_ndk开发环境

安装cygwin: 由于NDK编译代码时必须要用到make和gcc,所以你必须先搭建一个linux环境, cygwin是一个在windows平台上运行的unix模拟环境,它对于学习unix/linux操作环境,或者从unix到windows的应用程序移植,非常有用。通过它,你就

ygc87的专栏 9007

Android ndk开发

#什么是Android NDK Android NDK 是一套允许您使用 C 和 C++ 等语言,以原生代码实现部分应用的工具集。在开发某些类型的应用时,这有助于您重复使用以这些语言编写的代码库。 #Android NDK开发流程 ##ndk下载 由于android studio自带的ndk版本可能在编译中出现问题,所以自己在官网下载所需的ndk版本。本文以稳定版本(r16b)为例子。 ##ndk...

qq_39290017的博客 575

Windows环境下Android NDK的开发

Android的NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk文件。Android 应用开发者可以通过NDK调用C或C++本地代码。我们知道apk文件是很容易被反编译的,如果程序对于安全性的要求较高,这个时候就需要使用NDK了。如果我们要   在Windows环境下,也可以进行NDK的开发。下面是配置环境的具体的步骤:

::: 移动互联网时代开发者 ::: 2584
上一篇: OpenglES2.0 for Android:来做个地球吧
下一篇: Android NDK : 自己动手做so库
cassiePython
博客等级 码龄12年 303粉丝 135原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值