Android NDK开发简单程序分享(Hello Word!)

Android NDK开发简单程序分享(Hello Word!)攻略

简介

Android NDK(Native Development Kit)是安卓应用开发中的一个重要工具,它是一种工具集,可以让您以C或C++等本地语言编写部分代码或者本地库,然后将这些代码与Java代码结合,生成可以在Android设备上运行的应用程序。本文将提供一个完整的Android NDK开发环境搭建过程,以及使用Android NDK编写Hello Word程序的步骤解释。

环境搭建

  1. 确保您已经安装了JDK、Android SDK和Android NDK。您可以从Java官方网站(https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html)下载JDK,从安卓官方网站(https://developer.android.com/studio/index.html)下载Android SDK和Android NDK。
  2. 下载安装好CMake,具体步骤可参考(https://blog.csdn.net/m0_47624803/article/details/105402613)。

Hello Word程序编写

进入Android Studio,创建一个新项目,然后按照以下步骤操作:

  1. 首先,您可以通过右键单击项目名称并选择“New > Folder > JNI Folder”,然后选择“Src/main”,创建一个新的JNI目录。这样就可以在项目中编写本地代码。
  2. 下一步,您需要在“Build.gradle”文件的“Settings”节点中设置“ndk”和“cmake”参数。设置后,该文件应如下所示:
android {
    compileSdkVersion 30
    buildToolsVersion "30.0.2"

    defaultConfig {
        applicationId "com.example.ndktest"
        minSdkVersion 21
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"

        // 设置“ndk”和“cmake”参数
        ndkVersion '23.0.7123448'
        externalNativeBuild {
            cmake {
                cppFlags ""
                arguments "-DANDROID_STL=c++_shared"
            }
        }
    }

    //在“BuildTypes”节点下添加以下代码
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }

        // 添加配置项
        externalNativeBuild {
            cmake {
                cppFlags ""
                arguments "-DANDROID_STL=c++_shared"
            }
        }
    }

    // 切换到“External Tools”并单击自定义工具按钮
    externalTools {
        //"cmake"用于指向您的系统中的CMake实例的路径
        cmake {
            path "/Users/<username>/Library/Android/sdk/cmake/<version-number>/bin/cmake"
        }
    }

    //在android节点下添加以下内容以指定ABI构建。
    defaultConfig {
        ......
        ndk {
            abiFilters 'x86', 'x86_64', 'armeabi', 'armeabi-v7a', 'arm64-v8a'
        }
    }

    //切换到“externalNativeBuild”节点下,添加以下内容。
    externalNativeBuild {
        cmake{
            path "CMakeLists.txt"
        }
    }
}
  1. 接下来,您需要在CMakeLists.txt文件中指定C++源代码文件的路径。该文件位于“Src/main/cpp”下:
cmake_minimum_required(VERSION 3.4.1)

#设置路径以使CMake能够找到我们的源代码
add_library(hello-lib SHARED src/main/cpp/hello-lib.cpp)

# 添加NDK库
find_library(log-lib log)

# 链接NDK库
target_link_libraries(hello-lib ${log-lib})
  1. 创建一个名为“hello-lib.cpp”的新文件,并将以下内容复制到该文件中:
#include <string.h>
#include <jni.h>

extern "C" JNIEXPORT jstring JNICALL
Java_com_example_ndktest_MainActivity_stringFromJNI(JNIEnv* env, jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}
  1. 最后,在MainActivity.java文件中调用可由本地代码生成的函数。在下面的代码中,stringFromJNI()方法来自于我们在步骤四中编写的本地代码:
public class MainActivity extends AppCompatActivity {

    static {
        System.loadLibrary("hello-lib");
    }

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

        TextView tv = findViewById(R.id.sample_text);
        tv.setText(stringFromJNI());
    }

    //本地方法
    public native String stringFromJNI();
}

示例

假设您按照上述步骤完成了所有设置和代码编写。接下来,我们通过两个示例来说明HelloWord程序的编写过程。

示例1

在MainActivity.java文件中,您需要设内容视图,并在该视图上添加一个名为“sample_text”的TextView。该文件中的示例如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main_content"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="@dimen/app_padding">

    <TextView
        android:id="@+id/sample_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        tools:text="Hello World!" />

</RelativeLayout>

示例2

Android Studio为您生成了一个名为“hello-lib.cpp”的C++源代码文件。以下是一个示例,您可以在其中添加一些本地C++代码:

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

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

注意:此示例用于展示如何将本地C++代码与Java代码一起使用,并不会做很多实际工作。

结论

希望本文能够帮助您了解如何使用Android NDK开发Android应用程序,并为您提供详细的步骤和示例。如果您有任何问题或建议,请随时与我们联系。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android NDK开发简单程序分享(Hello Word!) - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • eclipse安装git插件

    Eclipse安装Git插件攻略 Git是一种流行的版本控制系统,而Eclipse是一种流行的集成开发环境(IDE)。在Eclipse中安装Git插件可以让您更方便地使用Git进行版本控制。以下是在Eclipse中安装Git插件的完整攻略,包括两个示例说明。 步骤 打开Eclipse,选择“Help”菜单,然后选择“Eclipse Marketplace”选…

    other 2023年5月8日
    00
  • Android中Fragment的生命周期与返回栈的管理

    那么让我们来详细讲解一下“Android中Fragment的生命周期与返回栈的管理”的完整攻略。 什么是Fragment Fragment是Android系统中重要的UI组件,它可以看做是一个子Activity,被设计成可嵌入在Activity中的组件。和Activity一样,Fragment也有自己的生命周期,包括onCreate、onCreateView…

    other 2023年6月27日
    00
  • 什么是操作系统

    什么是操作系统? 操作系统(Operating System,简称 OS)是一种控制计算机硬件和软件资源的程序集合,它是计算机系统中最基本的系统软件。操作系统提供了操作计算机所必须的各种服务,如用户管理、内存管理、文件管理、进程管理、设备管理等等。 操作系统的功能 按照常见的分类方式,操作系统具有以下主要功能: 进程管理:进程是计算机中正在执行的程序实例,在…

    其他 2023年4月16日
    00
  • 对numpy中的where方法嵌套使用详解

    对numpy中的where方法嵌套使用详解 numpy是一个用于科学计算的Python库,提供了丰富的数值计算工具和数据结构。其中的where方法是一个非常有用的函数,可以根据条件从数组中选择元素。在本攻略中,我们将详细讲解如何嵌套使用where方法,并提供两个示例说明。 基本语法 numpy.where方法的基本语法如下: numpy.where(cond…

    other 2023年7月27日
    00
  • 阿里前端框架alice是个不错的选择

    阿里前端框架alice是个不错的选择攻略 阿里前端框架alice是一个基于React的前端框架,它提供了一系列的组件和工具,可以帮助开发者快速构建高质量的Web应用程序。本文将详细讲解阿里前端框架alice是个不错的选择的攻略,包括框架特点、应用场景、优势和示例说明。 框架特点 阿里前端框架alice的特点包括: 基于React,易于学习和使用。 提供了一系…

    other 2023年5月7日
    00
  • SpringBoot应用线上重启脚本的命令详解

    命令概述 SpringBoot是一种轻量级的Java web框架,常用于快速开发微服务应用。但是在线上环境中,如何对SpringBoot应用进行重启,成为了每位开发者必须解决的问题。下面是SpringBoot应用线上重启脚本的命令详解: #!/bin/bash # SpringBoot应用线上重启脚本 # 进入SpringBoot应用文件夹 cd /path…

    other 2023年6月27日
    00
  • 动态加载iframe

    动态加载iframe是指在页面运行时动态生成一个iframe元素,并把该元素添加到页面中的某个位置。这种技术常用于异步加载外部资源,提高页面性能。 动态加载iframe的完整攻略如下: 1. 创建一个空的iframe元素 <iframe id="myFrame"></iframe> 2. 使用JS动态设置ifram…

    other 2023年6月25日
    00
  • Python全栈之作用域和闭包

    Python全栈之作用域和闭包攻略 作用域(Scope) 在Python中,作用域是指变量的可访问性和可见性范围。Python中有三种作用域:全局作用域、局部作用域和内建作用域。 全局作用域 全局作用域是在整个程序中都可访问的作用域。在全局作用域中定义的变量可以在程序的任何地方使用。 x = 10 # 全局变量 def foo(): print(x) # 可…

    other 2023年7月28日
    00
合作推广
合作推广
分享本页
返回顶部