Android NDK开发基础

Native Development Kit


下载NDK开发包

链接:http://developer.android.com/ndk/downloads/index.html

选择NDK r10e

android-ndk-r10e-windows-x86_64.exe

自解压文件大小400M,解压后3G+。

配置NDK环境变量

将ndk目录添加到系统环境变量path,然后在新打开的cmd输入ndk-build验证:

HelloJni

Eclipse安装ADT的时候,安装的有Android Native Development Tools,

导入位于android-ndk-r10e\samples\hello-jni的例子到Eclipse:

初始的目录结构:

然后打开cmd,切换到HelloJni项目目录:

执行ndk-build进行编译:

完成后回到Eclipse刷新HelloJni目录,发现增加了obj文件夹,里面有各个架构对应的.so库文件,如下图:

然后运行工程:

注意到上面执行ndk-build时,编译了很多架构,时间会长一些,如果只想编译我们需要的arm,可以将项目jni目录下的Application.mk文件的以下内容进行注释:

#APP_ABI := all

清除上次的编译:

ndk-build clean

再次ndk-build,很快完成:

第一个NDK项目

1.新建Android项目

在MainActivity里创建一个native方法:

    public static native String getStringFromC();

2.创建jni目录

3.编写java层native方法

4.生成JNI头文件

  • javah

cmd切换到项目目录,然后执行:

javah -classpath bin/classes -d jni com.zms.hellondk.MainActivity

javah -classpath bin/classes;D:\Android\sdk\platforms\android-22\android.jar -d jni com.zms.hellondk.MainActivity

这样比较麻烦,也可以: 添加android.jar到环境变量:D:\Android\sdk\platforms\android-22\android.jar

可以看到jni目录下生成了.h头文件:

格式如下:

然后在jni目录下创建我们自己的c文件:

hello.c

#include<stdio.h>
#include<stdlib.h>
#include"com_zms_hellondk_MainActivity.h"

JNIEXPORT jstring JNICALL Java_com_zms_hellondk_MainActivity_getStringFromC(
        JNIEnv env, jclass jclass) {
    return (*env)->NewStringUTF(env, "Hello from JNI !");
}

然后在jni目录下创建Android.mk文件:

Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := HelloNdk
LOCAL_SRC_FILES := hello.c #对哪个c文件进行编译

include $(BUILD_SHARED_LIBRARY)

然后进入cmd切换到工程目录进行编译:

注意,MainActivity里要写加上loadLibrary,引号里是Module名,static区声明的代码会先于onCreate方法执行:

package com.zms.hellondk;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;

public class MainActivity extends Activity {
    public static native String getStringFromC();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView textFromJni = (TextView) findViewById(R.id.textFromJni);
        textFromJni.setText(getStringFromC());
    }

    static {
        System.loadLibrary("HelloNdk");
    }
}

否则会出现以下错误:

(- -,不要问我是怎么知道的)

NDK相关概念

  • NDK的应用场景

    • 代码的保护(Java代码容易被反编译,C/C++库)
    • 代码复用性:多数开源库用C/C++编写(如OpenCV,FFmpeg等)
    • 便于移植(在其他嵌入式平台上再次使用,如iOS)
  • 交叉编译

    使用工具在一个平台编译生成另一个平台可执行的代码。

  • JNI(Java Native Interface)

    是Java平台标准的一部分,允许Java代码和其他语言代码进行交互

  • 链接库(静态,动态)
    • 静态链接库
    • 动态链接库
  • mk配置文件(make)参数
  • ndk开发包目录
时间: 2024-10-24 19:15:28

Android NDK开发基础的相关文章

Android NDK开发(八)——应用监听自身卸载,弹出用户反馈调查

转载请注明出处:http://blog.csdn.net/allen315410/article/details/42521251 监听卸载情景和原理分析 1,情景分析 在上上篇博客中我写了一下NDK开发实践项目,使用开源的LAME库转码MP3,作为前面几篇基础博客的加深理解使用的,但是这样的项目用处不大,除了练练NDK功底.这篇博客,我将讲述一下一个各大应用中很常见的一个功能,同样也是基于JNI开发的Android应用小Demo,看完这个之后,不仅可以加深对NDK开发的理解,而且该Demo也可

Android NDK开发(二)——从Hello World学起

转载请注明出处:http://blog.csdn.net/allen315410/article/details/41805719  上篇文章讲述了Android NDK开发的一些基本概念,以及NDK的环境搭建,相信看过的朋友NDK开发环境搭建应该是没有问题了,还没有搭建或者不知道怎么搭建的朋友请点击这里.那么这篇文章,我们跟刚学Java编程语言一样,从世界知名程序"Hello World!"开始,开发出我们的第一个NDK程序. NDK目录简单介绍 在进行NDK开发之前,我们有必须熟悉

Android NDK开发(七)——现代化开发方式

本专栏的前面几篇博客写了一些Android下通过JNI进行NDK开发的基础知识,主要步骤在里面也写的很清晰,但是看起来比较麻烦,为什么呢?可能细心的朋友会发现我每次在进行交叉编译的时候,是通过cygwin模拟Linux环境用ndk-build命令进行编译的,而且每次新建JNI工程的时候,都会在工程目录下手动的新建一个jni的目录,在该目录下新建C源码文件和Android.mk配置文件,这一系列的操作显得特别繁琐,尤其是cygwin,首先其下载安装是个非常耗时耗力的操作,其次使用cygwin还需要

Android NDK开发(六)——使用开源LAME转码mp3

转载请注明出处:http://blog.csdn.net/allen315410/article/details/42456661 在本专栏的前面几篇博客中讲述了一些Android NDK开发的基础,从环境搭建一直到利用JNI进行Java端和C端代码的互相调用,并且的讲解的Demo也是很简单易懂的,相信掌握前面博客的大部分内容,就可以着手在实际项目中利用JNI进行NDK开发了,那么既然基础过了,接下来我在这里尝试去使用真实项目中去.我们知道,C语言因为高效,而且又是最早期的高级编程之一,一直存活

Android NDK开发篇(五):Java与原生代码通信(数据操作)

尽管说使用NDK能够提高Android程序的运行效率,可是调用起来还是略微有点麻烦.NDK能够直接使用Java的原生数据类型,而引用类型,由于Java的引用类型的实如今NDK被屏蔽了,所以在NDK使用Java的引用类型则要做对应的处理. 一.对引用数据类型的操作 尽管Java的引用类型的实如今NDK被屏蔽了,JNI还是提供了一组API,通过JNIEnv接口指针提供原生方法改动和使用Java的引用类型. 1.字符串操作 JNI把Java的字符串当作引用来处理,在NDK中使用Java的字符串,须要相

Android NDK 开发(三)--常见错误锦集合Log的使用【转】

转载请注明出处:http://blog.csdn.net/allen315410/article/details/41826511  Android NDK开发经常因某些因素会出现一些意想不到的错误,很多时候调试这些错误的时候,显得比调试Java代码要复杂,一方面是导致错误的原因很多很杂,另一方面NDK开发涉及到C/C++代码的编写,很多程序员对此不熟悉.那么这篇博客就总结一下,在NDK开发中经常出现的一些问题,并且尝试提供一些正确的解决方案,方便在开发时能够快速定位到错误,更改错误,当然了,错

Android NDK 开发

NDK全称:Native Development Kit. 1.NDK是一系列工具的集合. * NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk.这些工具对开发者的帮助是巨大的. * NDK集成了交叉编译器,并提供了相应的mk文件隔离平台.CPU.API等差异,开发人员只需要简单修改mk文件(指出"哪些文件需要编译"."编译特性要求"等),就可以创建出so. * NDK可以自动地将so和Java应用一起

C++开发安卓、windows下搭建Android NDK开发环境

1. NDK(Native Development Kit) 1.1 NDK简介 Android NDK是一套允许开发人员使用本地代码(如C/C++)进行Android APP功能开发的工具,通过这个工具,我们可以把用C/C++代码编译成可以直接运行在Android平台上的本地代码,这些本地代码以动态链接库( *.so )的形式存在,也正因为这样,我们可以通过复用这些动态链接库从而复用本地代码. 那么,通过NDK这个开发工具包,那么我们是否可以将一个APK完全使用C/C++来编写呢? 答案是不可

Android NDK 开发(四)java传递数据到C【转】

转载请注明出处:http://blog.csdn.net/allen315410/article/details/41845701 前面几篇文章介绍了Android NDK开发的简单概念.常见错误及处理和从第一个Hello World开始实际做一个简单的JNI开发示例,相信看完之后,大家对NDK开发有了一个概念上的认识了,那么接下来我们需要再深入一下NDK的开发,我们知道NDK开发就是使用JNI这层“协议”在Java和C之间起个“桥梁”的作用,将Java和Native C之间联立起来,让Java