Android Studio NDK基础使用

NDK是什么?

Android平台是基于java实现,运行于虚拟机Dalvik;故而使用Android SDK创建应用程序需要使用java语言来编写实现。不过并不仅限于使用java,google在发布android之初就宣称支持持JNI编程方式,也就是第三方应用完全可以通过JNI调用自己的C动态库,即在Android平台上,“Java+C”的编程方式是一直都可以实现的。NDK即为了方便你创建应用时调用本地C/C++的一系列工具集合。

The NDK is a toolset that allows you to implement parts of your app using native-code languages such as C and C++. For certain types of apps, this can be helpful so you can reuse existing code libraries written in these languages, but most apps do not need the Android NDK.

官方NDK文档:http://wear.techbrood.com/tools/sdk/ndk/

什么时候使用NDK?

Before downloading the NDK, you should understand that the NDK will not benefit most apps. As a developer, you need to balance its benefits against its drawbacks. Notably, using native code on Android generally does not result in a noticable performance improvement, but it always increases your app complexity. In general, you should only use the NDK if it is essential to your app—never because you simply prefer to program in C/C++.

官方清楚的描述了大部分应用并不会因为使用NDK而获得明显的性能收益,反而有可能导致应用的复杂度增加,兼容性变差等。Google建议在需要在处理需要大量计算/高CPU消耗的工作时使用NDK来提高运算处理效率,例如:游戏引擎、信号处理、图像处理等。

而实际使用NDK时往往还会考虑到:

1. 代码的保护,由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。

2. 为了方便地使用现存的开源库,大部分现存的开源库都是用C/C++代码编写的。

3. 跨平台考虑,用C/C++写得库可以方便在其他的嵌入式平台上再次使用。

AS 上使用NDK 示例

使用NDK,当然要先下载最新NDK工具:http://developer.android.com/ndk/downloads/index.html

配置项目的NDK路径:

查看local.properties是否定义好NDK路径:

  • Project Gradle NDK配置

    更改project的gradle.properties文件,加入android.useDeprecatedNdk=true,使得项目支持NDK:

修改app下build.gradle的defaultConfig,配置native c/c++编译本地so库:

申明JNI函数,在java代码内编写需要实现JNI的native函数:

package com.example.jokerlee.myapplication;

/**
 * Created by jokerlee on 16-3-31.
 */
public class JniTest {

    //使用jni需要加载本地编译出来的so库,名称即为上一步配置的ndk moduleName
    static {
        System.loadLibrary("jniTest");
    }

    public static  native String getStringFromJni();
}

Rebuild Project之后NDK工具会在app的build/intermediates目录下产生一个classses文件夹:

打开AS的terminal执行使用javah命令将java class声明的JNI方法转化成C\C++头文件

关于javah命令详解可参考:http://blog.csdn.net/zzhays/article/details/10514767

在当前debug目录生成com_example_jokerlee_myapplication_JniTest.h:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_jokerlee_myapplication_JniTest */

#ifndef _Included_com_example_jokerlee_myapplication_JniTest
#define _Included_com_example_jokerlee_myapplication_JniTest
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_example_jokerlee_myapplication_JniTest
 * Method:    getStringFromJni
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_jokerlee_myapplication_JniTest_getStringFromJni
  (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif

然后就是根据该头文件创建c/cpp文件TestJni.cpp实现头文件中的函数声明,并将这些头文件和c/cpp文件移动到main/src目录下:

//
// Created by jokerlee on 16-3-31.
//
#include "com_example_jokerlee_myapplication_JniTest.h"

JNIEXPORT jstring JNICALL Java_com_example_jokerlee_myapplication_JniTest_getStringFromJni
  (JNIEnv * env, jclass ){
    return env->NewStringUTF("这里是来自c的string");
  }

使用JNI函数

前面完成各种配置以及c/c++文件的编写之后,在应用内若需要实现JNI调用native函数,则需要先加载native code编译出来的so库:

//jniTest为库的名称,即为配置在app build.gradle defaultConfig的moduleName
System.loadLibrary("jniTest");
package com.example.jokerlee.myapplication;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

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

        Log.d("test", JniTest.getStringFromJni() );
    }
}

时间: 2024-10-21 03:08:32

Android Studio NDK基础使用的相关文章

android studio NDK 开发初探

android studio NDK 开发初探 环境配置 1)下载ndk 2)在android studio中配置ndk 路径 3)配置gradle 在gradle.properties中加入 android.useDeprecatedNdk=true配置 开启ndk 在开发过程中我们有时还会用到c++中到stl库这时我们就需要在build.gradle 中加入 defaultConfig { ndk { moduleName "jnitest" stl "stlport_s

Android Studio NDK开发

整理完Eclipse的NDK开发,再整理下Android Studio的.. 一个比较不错的百度网盘: http://pan.baidu.com/share/home?uk=2383159761  经常更新最新的Android方面的开发包,可以到里面下载到ndk的包 创建一个Android的工程,放一个TextView用于显示文字,功能很简单,从native层获取字符串并显示到TextView上 然后编写相关代码: public class MainActivity extends AppCom

Android Studio NDK及so文件开发

前言 什么是NDK? NDK全称是Native Development Kit,NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk.NDK集成了交叉编译器(交叉编译器需要UNIX或LINUX系统环境),并提供了相应的mk文件隔离CPU.平台.ABI等差异,开发人员只需要简单修改mk文件(指出"哪些文件需要编译"."编译特性要求"等),就可以创建出so. 为什么使用NDK? 1.代码的保护.由于apk的ja

[Android Studio][NDK]Execution failed for task &#39;:app:compileDebugNdk&#39;. Error Code:2

Execution failed for task ':app:compileDebugNdk'. > com.android.ide.common.internal.LoggedErrorException: Failed to run command: C:\Users\sodinochen\AppData\Local\Android\ndk-r10b\ndk-build.cmd NDK_PROJECT_PATH=null APP_BUILD_SCRIPT=C:\Users\sodinoch

NDK 在 Android studio如何使用(Android studio NDK)

其实这个东西入门的话.直接在官网查找demo再结合文档就能间接了解如何构建是最快捷的. 这里提供一下官网和demo的地址. 官网的NDK在Android studio的搭建:http://tools.android.com/tech-docs/new-build-system/gradle-experimental 官网的Demo:https://github.com/googlesamples/android-ndk 我比较懒:直接在Android studio中的File -->import

android studio ndk配置和ndk开发

配置开发环境: 1:下载ndk,导入android studio中. 2:在项目中引入NDK   3:在计算机path变量中导入NDK路径,在编译.h文件的时候会用到. 一:建立java的native方法,然后编译生成.class文件. 二:根据.class文件生成.h文件. 1:打开Terminal,然后进入APP目录下的main主目录. 2:输入命令. 3:生成.h文件,生成的jni文件夹在main文件夹下. 三:根据.h文件编写.c文件. #include <string.h> #inc

Android Studio NDK 开发配置

一:使用gradle experimental plugin 首先,我们不能用android studio默认的gradle插件,我们需要把android studio的插件改为gradle experimental plugin, 这个plugin是google开发的,网址在这里: http://tools.android.com/tech-docs/new-build-system/gradle-experimental Gradle experimental plugin是android 

android studio NDK配置

向您的项目添加 C 和 C++ 代码 本文内容 下载 NDK 和构建工具 创建支持 C/C++ 的新项目 构建和运行示例应用 向现有项目添加 C/C++ 代码 创建新的原生源文件 创建 CMake 构建脚本 将 Gradle 关联到您的原生库 搭配使用 Android Studio 2.2 或更高版本与 Android Plugin for Gradle 版本 2.2.0 或更高版本时,您可以将 C 和 C++ 代码编译到 Gradle 与 APK 一起打包的原生库中,将这类代码添加到您的应用中

Android?Studio?NDK编程-环境搭建及Hello!

一,下载 安装android-ndk开发包 NDK各个版本链接二,新建项目NDKDemo,选择空Activity就可以:(注:Android studio 2.2,可通过SDK Tools 添加LLDB,CMake,更方便的开发jni程序了) 三,按F12,配置项目NDK路径: 四,在MainActivity中添加如下代码: static {    System.loadLibrary("MyJni");//导入生成的链接库文件}public native String getStri