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日

相关文章

  • 安装并配置前端自动化工具——grunt

    安装并配置前端自动化工具——grunt的完整攻略 Grunt是一款前端自动化工具,可以帮助我们自动化完成一些重复性的任务,如压缩、合并、编译等。本文将为您提供安装并配置Grunt的完整攻略,包括安装、配置、使用和示例。 安装Grunt 在安装Grunt之前,您需要先安装Node.js和npm。安装完成后,您可以使用以下命令安装Grunt: npm insta…

    other 2023年5月6日
    00
  • div嵌套div布局

    div嵌套div布局 在Web开发中,div元素是一种非常常用的布局元素。通过嵌套div元素,可以实现复杂布局效果。本文介绍如何使用div嵌套div实现布局,并提供两个示例说明。 基本语法 div元素是一个块级元素,可以用于创建容器。通过嵌套div元素,可以实现复杂的布局效果。以下是一个基本的div嵌套div的示例: <div class="…

    other 2023年5月7日
    00
  • office2016最新安装及激活教程

    Office2016最新安装及激活教程 1. 下载Office2016安装文件 登陆office官网; 点击我的帐户,输入自己的电子邮箱和密码登录; 在我的帐户页面中,找到Office设备标签,点击安装Office按钮; 接着,会弹出安装向导,按照提示下载Office2016的安装文件。 2. 安装Office2016 双击下载好的安装文件,开始安装程序; …

    其他 2023年4月16日
    00
  • iphone6/6s+设置QQ邮箱时显示用户名或密码错误的解决方法介绍

    iPhone6/6s+设置QQ邮箱时显示用户名或密码错误的解决方法介绍 问题描述 在设置QQ邮箱时,可能会出现用户名或密码错误的提示,并无法完成邮箱的设置。 解决方法 方法一:检查账号及密码是否正确 首先,我们需要确认QQ邮箱账号及密码输入是否正确。可以通过在电脑端或浏览器中登录QQ邮箱来进行确认。如果能够正常登录,则说明账号及密码输入正确,否则需要重置密码…

    other 2023年6月27日
    00
  • redis终于有比较大的进展了 redis3.0.1稳定版本发布 支持…

    Redis 3.0.1稳定版本发布,支持更多新特性 Redis是一个基于内存的Key-Value数据库,其以高性能、高并发和高可用性著称。Redis通常用作缓存、队列、实时处理等。 最新发布的Redis 3.0.1版本为我们带来了许多新特性,同时也修复了一些已知问题,使Redis更加稳定可靠。 新特性 Redis 3.0.1版本的新特性包括: 1. 完全感知…

    其他 2023年3月28日
    00
  • java静态类

    以下是详细讲解“Java静态类的完整攻略,过程中至少包含两条示例说明”的标准Markdown格式文本: Java静态类的介绍 在Java中,静态类是指使用static关键修饰的类。静态类与普通类有所不同,本攻略将介绍Java静态类的特点、用法和示例。 静态类的特点 Java静态类有以下特点: 静态类不能被实例化,因为它没有公共的构造函数。 静态类只能包含静态…

    other 2023年5月10日
    00
  • Android中EditText光标在4.0中的bug及解决方法

    Android中EditText光标在4.0中的bug及解决方法 在Android 4.0版本中,EditText控件的光标显示存在一些bug,可能会导致页面显示不正常。这个问题主要会出现在Android 4.0及以上的版本。本文将详细讲解该问题的出现原因和解决方法,并提供两种示例说明。 问题描述 在Android 4.0及以上的版本中,如果我们在EditT…

    other 2023年6月27日
    00
  • groupby多个条件

    groupby多个条件 在数据分析和处理过程中,经常需要按照多个条件进行分组求和、计数等操作。Python中的pandas库提供了groupby函数来实现按照某一或多个条件对数据集进行分组的功能。 基本语法 dataframe.groupby([‘col1’, ‘col2’, …]).agg_func() 其中col1、col2等为用来分组的列名,agg…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部