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进行讲解。

目录
相关文章
|
2月前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
2月前
|
缓存 前端开发 Android开发
安卓开发中的自定义视图:从零到英雄
【10月更文挑战第42天】 在安卓的世界里,自定义视图是一块画布,让开发者能够绘制出独一无二的界面体验。本文将带你走进自定义视图的大门,通过深入浅出的方式,让你从零基础到能够独立设计并实现复杂的自定义组件。我们将探索自定义视图的核心概念、实现步骤,以及如何优化你的视图以提高性能和兼容性。准备好了吗?让我们开始这段创造性的旅程吧!
42 1
|
2月前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
1月前
|
搜索推荐 前端开发 API
探索安卓开发中的自定义视图:打造个性化用户界面
在安卓应用开发的广阔天地中,自定义视图是一块神奇的画布,让开发者能够突破标准控件的限制,绘制出独一无二的用户界面。本文将带你走进自定义视图的世界,从基础概念到实战技巧,逐步揭示如何在安卓平台上创建和运用自定义视图来提升用户体验。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开新的视野,让你的应用在众多同质化产品中脱颖而出。
64 19
|
2月前
|
IDE Java 开发工具
移动应用与系统:探索Android开发之旅
在这篇文章中,我们将深入探讨Android开发的各个方面,从基础知识到高级技术。我们将通过代码示例和案例分析,帮助读者更好地理解和掌握Android开发。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和技巧。让我们一起开启Android开发的旅程吧!
|
1月前
|
JSON Java API
探索安卓开发:打造你的首个天气应用
在这篇技术指南中,我们将一起潜入安卓开发的海洋,学习如何从零开始构建一个简单的天气应用。通过这个实践项目,你将掌握安卓开发的核心概念、界面设计、网络编程以及数据解析等技能。无论你是初学者还是有一定基础的开发者,这篇文章都将为你提供一个清晰的路线图和实用的代码示例,帮助你在安卓开发的道路上迈出坚实的一步。让我们一起开始这段旅程,打造属于你自己的第一个安卓应用吧!
68 14
|
1月前
|
Java Linux 数据库
探索安卓开发:打造你的第一款应用
在数字时代的浪潮中,每个人都有机会成为创意的实现者。本文将带你走进安卓开发的奇妙世界,通过浅显易懂的语言和实际代码示例,引导你从零开始构建自己的第一款安卓应用。无论你是编程新手还是希望拓展技术的开发者,这篇文章都将为你打开一扇门,让你的创意和技术一起飞扬。
|
1月前
|
XML 存储 Java
探索安卓开发之旅:从新手到专家
在数字时代,掌握安卓应用开发技能是进入IT行业的关键。本文将引导读者从零基础开始,逐步深入安卓开发的世界,通过实际案例和代码示例,展示如何构建自己的第一个安卓应用。我们将探讨基本概念、开发工具设置、用户界面设计、数据处理以及发布应用的全过程。无论你是编程新手还是有一定基础的开发者,这篇文章都将为你提供宝贵的知识和技能,帮助你在安卓开发的道路上迈出坚实的步伐。
39 5
|
1月前
|
开发框架 Android开发 iOS开发
安卓与iOS开发中的跨平台策略:一次编码,多平台部署
在移动应用开发的广阔天地中,安卓和iOS两大阵营各占一方。随着技术的发展,跨平台开发框架应运而生,它们承诺着“一次编码,到处运行”的便捷。本文将深入探讨跨平台开发的现状、挑战以及未来趋势,同时通过代码示例揭示跨平台工具的实际运用。
132 3
|
1月前
|
XML 搜索推荐 前端开发
安卓开发中的自定义视图:打造个性化UI组件
在安卓应用开发中,自定义视图是一种强大的工具,它允许开发者创造独一无二的用户界面元素,从而提升应用的外观和用户体验。本文将通过一个简单的自定义视图示例,引导你了解如何在安卓项目中实现自定义组件,并探讨其背后的技术原理。我们将从基础的View类讲起,逐步深入到绘图、事件处理以及性能优化等方面。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和技巧。