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

相关文章

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

Python实战之SEO优化自动化工具开发指南

《Python实战之SEO优化自动化工具开发指南》在数字化营销时代,搜索引擎优化(SEO)已成为网站获取流量的重要手段,本文将带您使用Python开发一套完整的SEO自动化工具,需要的可以了解下... 目录前言项目概述技术栈选择核心模块实现1. 关键词研究模块2. 网站技术seo检测模块3. 内容优化分析模

Nginx中配置使用非默认80端口进行服务的完整指南

《Nginx中配置使用非默认80端口进行服务的完整指南》在实际生产环境中,我们经常需要将Nginx配置在其他端口上运行,本文将详细介绍如何在Nginx中配置使用非默认端口进行服务,希望对大家有所帮助... 目录一、为什么需要使用非默认端口二、配置Nginx使用非默认端口的基本方法2.1 修改listen指令

基于Java开发一个极简版敏感词检测工具

《基于Java开发一个极简版敏感词检测工具》这篇文章主要为大家详细介绍了如何基于Java开发一个极简版敏感词检测工具,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录你是否还在为敏感词检测头疼一、极简版Java敏感词检测工具的3大核心优势1.1 优势1:DFA算法驱动,效率提升10

MySQL按时间维度对亿级数据表进行平滑分表

《MySQL按时间维度对亿级数据表进行平滑分表》本文将以一个真实的4亿数据表分表案例为基础,详细介绍如何在不影响线上业务的情况下,完成按时间维度分表的完整过程,感兴趣的小伙伴可以了解一下... 目录引言一、为什么我们需要分表1.1 单表数据量过大的问题1.2 分表方案选型二、分表前的准备工作2.1 数据评估

Python开发简易网络服务器的示例详解(新手入门)

《Python开发简易网络服务器的示例详解(新手入门)》网络服务器是互联网基础设施的核心组件,它本质上是一个持续运行的程序,负责监听特定端口,本文将使用Python开发一个简单的网络服务器,感兴趣的小... 目录网络服务器基础概念python内置服务器模块1. HTTP服务器模块2. Socket服务器模块

MySQL进行分片合并的实现步骤

《MySQL进行分片合并的实现步骤》分片合并是指在分布式数据库系统中,将不同分片上的查询结果进行整合,以获得完整的查询结果,下面就来具体介绍一下,感兴趣的可以了解一下... 目录环境准备项目依赖数据源配置分片上下文分片查询和合并代码实现1. 查询单条记录2. 跨分片查询和合并测试结论分片合并(Shardin

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按

Java 与 LibreOffice 集成开发指南(环境搭建及代码示例)

《Java与LibreOffice集成开发指南(环境搭建及代码示例)》本文介绍Java与LibreOffice的集成方法,涵盖环境配置、API调用、文档转换、UNO桥接及REST接口等技术,提供... 目录1. 引言2. 环境搭建2.1 安装 LibreOffice2.2 配置 Java 开发环境2.3 配

SpringBoot结合Knife4j进行API分组授权管理配置详解

《SpringBoot结合Knife4j进行API分组授权管理配置详解》在现代的微服务架构中,API文档和授权管理是不可或缺的一部分,本文将介绍如何在SpringBoot应用中集成Knife4j,并进... 目录环境准备配置 Swagger配置 Swagger OpenAPI自定义 Swagger UI 底