`
cloudtech
  • 浏览: 4815436 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

Android NDK安装及使用简介

 
阅读更多

Android NDK安装及使用简介

什么是Android NDK

Android 应用程序是运行在Dalvik虚拟机之上的。NDK可以让你用本地代码例如C/C++来实现应用程序的一部分。这样可以为应用程序的某些类在复用已有代码或提高性能方面提供便利。

如果你的代码是用C/C++来实现的,你的应用程序仍然会被打包成.apk文件,并且仍然运行在虚拟机上。Android应用程序的模型是不变的。

NDK的下载及安装

NDK的官方下载地址为:

http://developer.android.com/sdk/ndk/index.html

下载完成后进行解压,就可以直接使用目录中的ndk-build了。为了使用方便,可以用如下命令将ndk-build放入默认路径中:

export PATH=$PATH:<你解压好的目录地址>

NDK的使用方法

目前为止,用C/C++编写Android应用程序有两种方式:

1. 用C/C++编写主要的逻辑层,再用java编写界面层并调用C/C++的库;

2. 用C/C++直接开发完整的应用程序,完全不用java。(仅Android 2.3之后的版本支持)

第一种方法较为通用,因为用java开发Android应用程序的界面比较简单;第二种方法较为复杂并且很少用到。在此我们只介绍第一种使用方法的步骤,第二种使用方法可以在第一种方法的基础上,参照NDK目录中自带的例子程序samples/native-activity。

我们以一个简单的例子,一步步带领大家写出一个简单的hello-jni程序。

第一步 建立一个Android工程

如果你使用eclipse进行开发,很简单,在此就不赘述了。不过为了与下文的名称保持一致,请把项目名设为hello-jni,包名为com.example.hellojni,类名为HelloJni。

如果你使用shell进行开发,执行如下三行命令即可:

mkdir hello-jni
cd hello-jni
android create project -p . -t android-8 -k com.example.hellojni -a HelloJni

第二步 编写C源文件及Makefile

在项目目录下新建一个jni目录,然后在jni目录下建立两个文件:

第一个:main.c文件,内容如下:

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

/* This is a trivial JNI example where we use a native method
 * to return a new VM String. See the corresponding Java source
 * file located at:
 *
 *   hello-jni/src/com/example/HelloJni/HelloJni.java
 */
jstring
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
                                                  jobject thiz )
{
    return (*env)->NewStringUTF(env, "Hello from JNI !");
}
第二个:Android.mk文件,内容如下:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := hello-jni
LOCAL_SRC_FILES := hello-jni.c

include $(BUILD_SHARED_LIBRARY)

第三步 编译C源码生成so文件

直接在hello-jni目录下执行ndk-build。如果编译成功,可以看到生成了libs/armeabi/libhello-jni.so文件,该文件就是我们得到的C库了。

第四步 在java源码中调用C库中的函数

在hello-jni下打开src/com/example/jni/HelloJni.java文件,可以看到Android SDK已经帮我们自动生成了一些代码:

package com.example.jni;

import android.app.Activity;
import android.os.Bundle;

public class HelloJni extends Activity
{
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}
为了调用我们用C写好的函数,需要对其进行简单修改,修改后内容如下:

package com.example.hellojni;

import android.app.Activity;
import android.widget.TextView;
import android.os.Bundle;


public class HelloJni extends Activity
{
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        TextView  tv = new TextView(this);
        tv.setText( stringFromJNI() );
        setContentView(tv);
    }

    public native String  stringFromJNI();

    static {
        System.loadLibrary("hello-jni");
    }
}
                                              
对比两个文件可以看到需要修改的几个地方:

1. 引入了一个 TextView

TextView  tv = new TextView(this);
2. 在末尾,我们在static域内调用了:

System.loadLibrary("hello-jni");
这个调用的目的就是引入刚刚编译好的那个C库,这个C库的名字就叫hello-jni,这个名字是我们在Android.mk文件中指定的:

LOCAL_MODULE    := hello-jni
这两处的名称需要保持一致。

3. 我们声明了一个函数

public native String  stringFromJNI();
并在TextView中调用了它,将其返回结果显示出来

tv.setText( stringFromJNI() );
这个函数定义的地方,就是我们在刚刚C文件中写道的

jstring
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
                                                  jobject thiz )
{
    return (*env)->NewStringUTF(env, "Hello from JNI !");
}
有人会问这两个函数的名称为什么不一样,有什么对应关系。没错,是不同。对应关系是

C中定义的名称为:Java_包名_类名_函数名

java中调用的名称为:函数名

第四步 编译生成apk文件

如果你使用eclipse进行开发,点击编译运行就可以了。

如果你使用shell进行开发,输入命令:

ant debug
在bin下就得到了HelloJni-debug.apk,用adb install即可进行安装了。

分享到:
评论

相关推荐

    从Android NDK安装ARM交叉编译工具链

    从Android NDK安装ARM交叉编译工具链涉及的技术领域包括Android开发、交叉编译、NDK使用、ARM架构以及Linux环境下的编译工具使用。以下是详细的知识点解析: Android NDK(Native Development Kit)是Android应用...

    android ndk-stack使用说明。

    在使用Cocos2d-x、JNI及Android NDK进行开发时,经常会遇到调试困难的问题。尤其是对于C/C++代码的调试,由于涉及到本地代码与Java层之间的交互,使得调试过程变得更为复杂。为了解决这一难题,`ndk-stack`工具...

    android-ndk(android-ndk-r23b-linux.zip)

    安装和使用NDK时,开发者通常需要配置环境变量,指向NDK的安装目录,然后使用提供的工具进行编译。在Android Studio中,可以通过集成的NDK支持进行更方便的开发,包括使用CMake作为构建系统。 总的来说,Android ...

    使用Android NDK编译Android平台的eXosip库

    1. **环境准备**:确保已安装Android Studio,其中包括NDK。在Android Studio的`File` &gt; `Project Structure`中,检查并配置NDK路径。 2. **获取源码**:下载eXosip的源代码,可以从其官方仓库或者通过Git克隆。在...

    Android NDK环境配置

    Android NDK环境配置是Android应用开发中的一个重要环节,它允许开发者使用C或C++编写高性能的原生代码,这些代码可以被编译成动态库并与Java应用一同打包成APK。NDK集成了交叉编译器,使得开发者能够针对不同的CPU...

    android-ndk(android-ndk-r25b-linux.zip)

    在Android应用开发中,NDK扮演着至关重要的角色,它允许开发者使用原生代码(如C和C++)来编写部分应用,以提高性能、利用硬件加速功能或复用现有的C/C++库。 1. **JNI(Java Native Interface)**: JNI是Java...

    ubuntu下android ndk编译环境搭建详细描述

    Android NDK(Native Development Kit)是一套工具,允许开发者使用C/C++编写部分应用代码,以提高性能或者利用特定硬件功能。以下是对该过程的详细描述: 一、安装基础软件 1. 更新系统:首先确保Ubuntu系统是...

    android-ndk(android-ndk-r23b-windows.zip)

    NDK是Android应用开发中的一个重要组成部分,它允许开发者使用原生代码(如C、C++)来编写部分应用程序,从而利用底层的硬件性能,提高程序运行效率,尤其是在处理图形计算、物理模拟和游戏引擎等高性能需求的场景下...

    android-ndk(android-ndk-r25b-windows.zip)

    6. **C++支持**:NDK支持C++11及更高版本,以及一些C++标准库,如STL,这使得C++开发者能在Android平台上更好地工作。 7. **LLVM/Clang支持**:NDK引入了LLVM/Clang作为替代GCC的编译器,提供了更好的性能和更现代...

    android-ndk(android-ndk-r26b-darwin.zip)

    **安装和使用Android NDK** 在macOS系统中,下载并解压"android-ndk-r26b-darwin.zip"后,通常会将NDK安装到指定目录,例如`~/Android/NDK`。然后,需要将其路径添加到环境变量中,以便于命令行工具的调用。 使用...

    Android NDK

    Android NDK 是 Android 官方提供的一款开发工具,允许开发者使用 C 和 C++ 语言编写 Android 应用程序。下面将详细介绍 Android NDK 的安装和配置过程。 一、下载安装 Android NDK Android NDK 可以从官方网站上...

    android ndk环境下移植libiconv方法 附源码

    2. **配置环境**:确保你已经安装了Android NDK,并且配置好了NDK的路径。在命令行中,可以使用`ndk-build`命令进行编译。 3. **创建Android.mk文件**:`Android.mk`是Android NDK的构建脚本,它告诉NDK如何编译源...

    android-ndk-r19c-linux-x86_64.zip

    《在Ubuntu 18.04上使用QT5.13构建基于Android NDK r19c的开发环境》 Android Native Development Kit (NDK) 是Google提供的一款工具集,用于在Android平台上进行原生代码(如C/C++)的开发。NDK r19c是其中的一个...

    androidndk开发实战

    接着,“Android NDK(r5b)环境搭建及JNI实现.docx”文件着重于JNI(Java Native Interface)的使用,这是Android应用与NDK之间通信的关键桥梁。JNI允许Java代码调用C/C++函数,反之亦然。开发者需要理解JNI的接口...

    android ndk下编译的live555源码(新版)

    NDK是Google提供的一个工具集,允许开发者在Android平台上使用C和C++编写原生代码。NDK的主要用途是提高性能、处理底层硬件交互以及利用已有的C/C++库,比如Live555。通过JNI(Java Native Interface),NDK可以与...

    ANdroid ndk 安装

    ### Android NDK安装与配置详解 #### 一、前言 在进行Android应用程序开发时,除了常见的Java开发...通过以上步骤,你已经成功地完成了Android NDK的基本安装和配置,可以开始探索使用C/C++进行Android开发的世界了。

    android-ndk(android-ndk-r26b-windows.zip)

    使用“android-ndk-r26b-windows.zip”,开发者需要解压到指定目录,并将其添加到Android Studio的环境变量中,以便在构建过程中使用。同时,Android Studio提供了对NDK的集成支持,可以在IDE内进行NDK相关的开发和...

    基于Android NDK 进行 OpenGL_ES开发的完整案例.doc

    Android NDK 和 OpenGL ES 简介 Android NDK(Native Development Kit)是一套工具集合,帮助开发者使用 C 或 C++ 语言开发 Android 应用程序的原生代码部分。OpenGL ES 是一个用于移动设备的图形 API,能够在 ...

    android-ndk(android-ndk-r25b-darwin.zip)

    3. **库的使用**:通过NDK,开发者可以直接在Android应用中使用C/C++编写的库,这大大扩展了可利用的开源库资源,例如OpenCV、FFmpeg等。 4. **跨平台开发**:C/C++代码的跨平台性使得同一套源代码可以在多个操作...

    非常强大的eclipse中android ndk开发环境的配置说明

    本文档将详细介绍如何在Eclipse中配置Android NDK开发环境,并实现C/C++代码的自动编译以及通过Eclipse使用Ant生成JNI所需的头文件。配置流程包括Linux和Windows两种环境下的步骤。 #### 二、配置前提 确保以下工具...

Global site tag (gtag.js) - Google Analytics