Android NDK开发系列教程1:环境搭建及基本代码结构

简介: 终于建了一个自己个人小站:https://huangtianyu.gitee.io,以后优先更新小站博客,欢迎进站,O(∩_∩)O~~ JNI全称 Java Native Interface , java本地化接口。

终于建了一个自己个人小站:https://huangtianyu.gitee.io,以后优先更新小站博客,欢迎进站,O(∩_∩)O~~
JNI全称 Java Native Interface , java本地化接口。即JNI是定义了一系列接口,所有实现该接口的JVM虚拟机都可以通过该接口实现Java和C/C++的混合编程。java和C/C++不同 , 它不会直接编译成平台机器码,而是编译成虚拟机可以运行的java字节码的.class文件,通过JIT技术即时编译成本地机器码,所以有效率就比不上C/C++代码,JNI技术就解决了这一痛点,实现Java调用C/C++代码。

1. Eclipse NDK开发环境搭建

在开发NDK之前,Java的SDK,Android的NDK,以及Eclipse的ADT工具都需要大家先安装好,在SDK早期版本中没有ndk相关文件,当最近的AndroidSDK中包含了ndk相关文件,所以下载NDK工具的麻烦事这里就没有了。唯一要注意的是需要配置下NDK的环境变量。这样可以方便进行编译。AndroidSDK主要文件夹参考如下:
AndroidSDK目录结构
这里讲Eclipse的配置就将下如何添加External Tool来快速生成.h文件以及快速进行ndk_build编译。

1.1 配置快速生成.h头文件的命令

  1. 点击Eclipse上面的图标,打开External Tool Configurations。
    这里写图片描述
  2. 然后打开如下界面,在如下界面中双击Program,在底下会生成一个New_configuration。
    这里写图片描述
    然后按照图片上面的格式填写相应的参数。
    Location填写javah.exe的位置:C:\Program Files\Java\jdk1.8.0_91\bin\javah.exe
    Working Directory填写当前的工作目录:${workspace_loc:/MyTest/src}
    Arguments填写相应的参数:
-classpath ${workspace_loc:/MyTest/src/bin/classes} -d ${workspace_loc:/MyTest/jni} -jni com.scu.MyNDK

之后在External Tool的地方就会生成一个JavaH的命令工具,点击即可生成对应的.h头文件了。这里要注意的是生成都文件前要先编译出.class文件。
其实这个和用javah.exe命令是一样的,具体命令如下:
这里写图片描述

2. Android Studio的配置

AS太强大了,所有你想要的只需要简单的添加一个依赖,AS就会自动帮你下载,完全不用你去下载。最新的Android Studio在新建工程的时候,选中Include C++ Support后,即可进行NDK开发,这里注意下在AS中的编译换成了CMake工具,这个工具配置上稍微和Android.mk有些许不同。其配置文件在新建工程的CMakeLists.txt里面配置。

在build.gradle里面也会自动配置cmake工具,配置如下:

    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }

3. 基本代码结构

利用AS创建工程后,工程会自动生成如下代码:

package zqc.com.example;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }
    // Used to load the 'native-lib' library on application startup.
    static {
        System.loadLibrary("native-lib");
    }

    /**
     * A native method that is implemented by the 'native-lib' native library,
     * which is packaged with this application.
     */
    public native String stringFromJNI();
}

其中在static静态代码块中会加载动态链接库。在一个方法前加上native关键字即表明该方法是一个jni方法,因而只有声明,没有实现,其具体实现在c/c++代码中。
找到cpp文件,打开后内容如下:

#include <jni.h>
#include <string>

extern "C"
JNIEXPORT jstring

JNICALL
Java_zqc_com_example_MainActivity_stringFromJNI(
        JNIEnv *env, jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}

其中extern “C”表示在编译的时候导出为c语言的格式,JNIEXPORT表示该函数是可以导出的,可以由外部方法进行调用,这和dll类似,jstring表示返回值,JNICALL关键字表示这是一个jni方法,Java_zqc_com_example_MainActivity_stringFromJNI其中Java是固定格式,zqc_com_example_MainActivity是全类名,stringFromJNI是具体的方法名,具体参数:JNIEnv env为env指针,调用jni的很多方法都需要该指针,jobject / this */这个表示当前类的this指针,这里因为没用到就没有命名。
在以往开发中可能是把.h和.cpp分开了,这个是AS自动生成的,这里并没有单独生成.h文件。c/c++开发也有自己的结构,这里除了需要对外暴露接口的需要按照上面格式编写外,其他的都可以用古老的c/c++进行编写并遵循古老的结构。你可以先定义.h文件,然后在.cpp里面具体实现。
点击Build->Make Project(快捷键Ctrl+F9)即可生成动态链接库文件.so,其路径在:
这里写图片描述
AS自动生成了Debug版和Release版,并且在各个版本中又生成了不同平台的.so文件。只能说这个AS太牛叉了~
之后运行工程,安装到手机上时就把对应的so也拷贝到了手机中了。

总结

目前应该是绝大多数人都采用AndroidStudio进行开发,谷歌官方已经不再对Eclipse的ADT进行维护了。而AS是绝对强大的工具,当你选择Include C++ Support的时候,AS会将NDK开发的一切都下载下来。所以如果采用AS开发,那么你学NDK开发的话,只需要把Android开发需要安装的JDK,SDK,AS等工具安装好后,即可进行开发。这个系列教程我也采用AS进行讲解。

目录
相关文章
|
5天前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
10天前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
12天前
|
Android开发 Swift iOS开发
探索安卓与iOS开发的差异和挑战
【10月更文挑战第37天】在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统扮演着主角。它们各自拥有独特的特性、优势以及面临的开发挑战。本文将深入探讨这两个平台在开发过程中的主要差异,从编程语言到用户界面设计,再到市场分布的不同影响,旨在为开发者提供一个全面的视角,帮助他们更好地理解并应对在不同平台上进行应用开发时可能遇到的难题和机遇。
|
12天前
|
存储 API 开发工具
探索安卓开发:从基础到进阶
【10月更文挑战第37天】在这篇文章中,我们将一起探索安卓开发的奥秘。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和建议。我们将从安卓开发的基础开始,逐步深入到更复杂的主题,如自定义组件、性能优化等。最后,我们将通过一个代码示例来展示如何实现一个简单的安卓应用。让我们一起开始吧!
|
13天前
|
存储 XML JSON
探索安卓开发:从新手到专家的旅程
【10月更文挑战第36天】在这篇文章中,我们将一起踏上一段激动人心的旅程,从零基础开始,逐步深入安卓开发的奥秘。无论你是编程新手,还是希望扩展技能的老手,这里都有适合你的知识宝藏等待发掘。通过实际的代码示例和深入浅出的解释,我们将解锁安卓开发的关键技能,让你能够构建自己的应用程序,甚至贡献于开源社区。准备好了吗?让我们开始吧!
24 2
|
开发工具 Android开发 git
|
14天前
|
XML 存储 Java
探索安卓开发之旅:从新手到专家
【10月更文挑战第35天】在数字化时代,安卓应用的开发成为了一个热门话题。本文旨在通过浅显易懂的语言,带领初学者了解安卓开发的基础知识,同时为有一定经验的开发者提供进阶技巧。我们将一起探讨如何从零开始构建第一个安卓应用,并逐步深入到性能优化和高级功能的实现。无论你是编程新手还是希望提升技能的开发者,这篇文章都将为你提供有价值的指导和灵感。
|
14天前
|
Android开发
布谷语音软件开发:android端语音软件搭建开发教程
语音软件搭建android端语音软件开发教程!
|
22天前
|
编解码 Java Android开发
通义灵码:在安卓开发中提升工作效率的真实应用案例
本文介绍了通义灵码在安卓开发中的应用。作为一名97年的聋人开发者,我在2024年Google Gemma竞赛中获得了冠军,拿下了很多项目竞赛奖励,通义灵码成为我的得力助手。文章详细展示了如何安装通义灵码插件,并通过多个实例说明其在适配国际语言、多种分辨率、业务逻辑开发和编程语言转换等方面的应用,显著提高了开发效率和准确性。
|
21天前
|
Android开发 开发者 UED
安卓开发中自定义View的实现与性能优化
【10月更文挑战第28天】在安卓开发领域,自定义View是提升应用界面独特性和用户体验的重要手段。本文将深入探讨如何高效地创建和管理自定义View,以及如何通过代码和性能调优来确保流畅的交互体验。我们将一起学习自定义View的生命周期、绘图基础和事件处理,进而探索内存和布局优化技巧,最终实现既美观又高效的安卓界面。
30 5