Windows环境下Android Studio进行NDK开发

2024-08-22 18:18

本文主要是介绍Windows环境下Android Studio进行NDK开发,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Android Studio对Ndk的支持正在不断的完善。之前有试过写demo,成功运行了。但整个过程遇到了不少的问题,而且网上搜集到的问题答案各种各样,大部分都是互相复制粘贴,没有自己的思路。今天趁着放假,把自己实现过程记录下来

项目结构图

项目结构

1 NDK配置

1.1 首先需要到官网下载NDK,我下边的例子采用的是android-ndk-r10b。

1.2 将下载的文件解压到一个目录(目录可自由选择),在环境变量Path中添加该NDK的路径

1.2.1 例如我把文件解压到了D盘的Software/AndroidNDK/目录下,那就将D:\Software\AndroidNDK\android-ndk-r10b;添加到环境变量Path中

1.2.2 至于怎么找到这个环境变量呢?有配置过jdk的估计都知道,这里也给出流程:右击【我的电脑】>点击【属性】>点击【高级系统设置】>点击【环境变量】>在系统变量中就可以找到Path这个环境变量

2 创建项目

2.1 在AS中创建一个名为NDKStudy(当然,这个名字可自定义,这里只是使用我自己写的项目阐述罢了)的项目

2.2 定义native方法

2.2.1 定义了一个StringUtil类,里边声明了一个native方法

public class StringUtil {// 这里主要用于加载我们通过NDK开发生成的.so文件static {System.loadLibrary("JniTest");}// 声明的native方法public static native String getShowText();
}

2.2.2 重新编译一次项目

rebuild

这是AS会自动帮我们生成java文件对应的class文件,生成的class文件保存在C:\Users\SAMSUNG\Desktop\NDKStudy(此处为项目的路径)\app\build\intermediates\classes\debug\util下
class文件路径

2.2.3 JNI头文件生成与实现

我们知道AS有个命令行的控制窗口,可以直接在这个窗口执行命令
javah跳转执行位置

2.2.3.1 先通过cd命令进入到class文件所在的目录,这里就有几个地方需要注意的了:

1 我的StringUtil是处于util这个包下方的,cd只是进入了C:\Users\SAMSUNG\Desktop\NDKStudy\app\build\intermediates\classes\debug>这层,没有进一步到达util,这个很重要。执行命令的路径错了,就会报【找不到类文件】
找不到类文件

2 这里还有一种情况也会报找不到类文件,就是你的classpath环境变量没有配置好,需要检查下

2.2.3.2 执行命令: javah -jni util.StringUtil

1 这里有一点需要注意的
全名
可以看到,其实命令行的帮助说明已经说的很明白了

2 执行命令后,可以看到在C:\Users\SAMSUNG\Desktop\NDKStudy\app\build\intermediates\classes\debug路径下自动生成了一个jni头文件:util_StringUtil.h
头文件

2.2.3.3 生成jni文件夹
生成jni文件夹

2.2.3.4 将刚才自动生成的jni头文件复制粘贴到创建的jni文件夹中,并创建一个同名的util_StringUtil.c文件
生成.C文件

2.2.3.5 将util_StringUtil.h中的方法内容复制到util_StringUtil.c文件中,当然还要加载头文件的引用语句:#include “util_StringUtil.h”

复制内容为
复制

2.2.3.6 在util_StringUtil.c中实现getShowText()方法,这是就涉及到jni的语法了

#include "util_StringUtil.h"JNIEXPORT jstring JNICALL Java_util_StringUtil_getShowText(JNIEnv *env, jclass obj){return (*env)->NewStringUTF(env,"This is Test!");
}

2.3 基本配置

2.3.1 app下build.gradle文件的配置

defaultConfig {// 需要增加该配置 ndk {moduleName "JniTest"         //生成的so名字abiFilters "armeabi", "armeabi-v7a", "x86" // 指定生成的.so支持的架构平台,可不设置}}

2.3.2 gradle.properties配置

// 支持旧版本的ndk
android.useDeprecatedNdk=true

2.3.3 local.properties的配置

// 该两项可以通过AS的设置进行指定
// 指定ndk的路径
ndk.dir=D\:\\Software\\AndroidNDK\\android-ndk-r10b
// 指定sdk的路径
sdk.dir=D\:\\Software\\AndroidSDK

2.4 使用

2.4.1 初始化so库

static {System.loadLibrary("JniTest");
}

2.4.2 native方法的使用

@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);TextView tvShow = (TextView) findViewById(R.id.tv_show);// 正常调用即可tvShow.setText(StringUtil.getShowText());
}

3 NDK该版本的bug

运行时,发现项目没有编译通过:make: No rule to make target.*
这应该算是ndk该版本的一个bug,不支持单独一个.c文件进行编译。于是,我在jni目录下多创建了一个空的util.c文件,就能正常编译通过了。并且顺利运行啦!

总结

其实,整个流程下来,需要注意的地方确实不少。而且网上搜集的资料多半是从别人那里截取一部分,然后不加以说明,很容易被搞混。所以要想搞懂整个NDK的开发,还是需要自己一步一个脚印来实现一把。

其次,需要更好的运用NDK,我们不仅需要扎实的c/c++的知识基础,还要对jni的语法有深入的理解

这篇关于Windows环境下Android Studio进行NDK开发的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1097033

相关文章

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

Python使用自带的base64库进行base64编码和解码

《Python使用自带的base64库进行base64编码和解码》在Python中,处理数据的编码和解码是数据传输和存储中非常普遍的需求,其中,Base64是一种常用的编码方案,本文我将详细介绍如何使... 目录引言使用python的base64库进行编码和解码编码函数解码函数Base64编码的应用场景注意

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

Java进行文件格式校验的方案详解

《Java进行文件格式校验的方案详解》这篇文章主要为大家详细介绍了Java中进行文件格式校验的相关方案,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、背景异常现象原因排查用户的无心之过二、解决方案Magandroidic Number判断主流检测库对比Tika的使用区分zip

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark