Android C++笔记2-NDK详解

来源:互联网 发布:淘宝贷款是什么意思 编辑:程序博客网 时间:2024/06/02 06:42

NDK组成

NDK(native developer kits)包括API、交叉编译器、链接程序、调试器、构建工具、文档和示例程序。组要组件有ARM,x86和MIPS交叉编译器、构建系统、java原生接口头文件、C库、Math库、POSIX线程、ZLib压缩库、动态链接库、Android日志库、Android像素缓冲区库、android原生应用apis、OpenGL ES 3D图形库、OpenGL ES原生音频库、OpenMax AL 最小支持。

NDK目录结构

这里写图片描述

  • ndk-build 该脚本是Android NDK构建系统的起始点;
  • ndk-gbd 该脚本允许用GUN调试器调试原声组件;
  • ndk-stack该脚本可以帮助分析原生组件崩溃时的堆栈追踪;
  • build 改目录包含了Android NDK构建系统的所有模块;
  • platforms改目录包含了不同Android版本的头文件和库文件,Android NDK构建系统会根据具体的Android版本自动引用这些文档;
  • sampleperf 该目录是Android的CPU分析器
  • soures 该目录包含了可供开发人员导入到现有的Android NDK项目的一些共享模块;
  • toolchains 改目录包含目前Android NDK支持的不同目标机体系结构的交叉编译器。目前支持ARM、X86和MIPS机体系结构。

NDK示例

1.用AndroidStudio新建一个项目

在AS中新建一个Project,然后再新建一个class为NdkTest,在内部声明native方法;

package com.billshuai.hellondk;public class NdkTest {    public native String getNdkString();}

在主Activity中写入如下代码调运JNI的string显示在textview上。

public class MainActivity extends AppCompatActivity {    private TextView text;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        text = (TextView)findViewById(R.id.text);        NdkTest ndkTest = new NdkTest();        text.setText(ndkTest.getNdkString());    }}

然后点击build按钮, 生成classes文件夹,如图:
这里写图片描述

2.用javah生成对应的 .h头文件

点开AS的Terminal标签,进入C:\Users\Administrator\Desktop\HelloNDK\app\build\intermediates\classes\debug目录;

cd C:\Users\Administrator\Desktop\HelloNDK\app\build\intermediates\classes\debug

然后执行javah,生成.h文件

javah -jni com.billshuai.hellondk.NdkTest

在main文件下新建一个jni文件夹然后将com_billshuai_hellondk_NdkTest.h复制到这个文件夹下;
然后在jni文件夹中新建一个.c文件,代码,如下:

#include "com_billshuai_hellondk_NdkTest.h"/* * Class:     com_billshuai_hellondk_NdkTest * Method:    getNdkString * Signature: ()Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_com_billshuai_hellondk_NdkTest_getNdkString  (JNIEnv *env, jobject obj){     return (*env)->NewStringUTF(env,"jni 数据"); }

3.最后配置信息

查看在工程的local.properties文件是否添加了NDK路径,类似其中的SDK路径一样,添加后如下:

ndk.dir=D\:\\android\\AndroidStudio1.5\\StudioSDK\\ndk-bundlesdk.dir=D\:\\android\\AndroidStudio1.5\\StudioSDK

接下来在app目录下的build.gradle中设置库文件名(生成的so文件名)。找到gradle文件的defaultConfig这项,在里面添加如下内容:

ndk{        moduleName "BingsmanJniLibName"         //生成的so名字        abiFilters "armeabi", "armeabi-v7a", "x86"  //输出指定三种abi体系结构下的so库。目前可有可无。    }

生成的so库之后,那就去代码的NdkTest Java文件,静态初始化,代码添加如下:

 static {        System.loadLibrary("BingsmanJniLibName");   //defaultConfig.ndk.moduleName    }

4.运行改错

满心欢喜运行,结果如图:
这里写图片描述
修改:在gradle.properties文件中加入:

android.useDeprecatedNdk=true

再次运行,结果如图:
这里写图片描述

源代码下载

0 0
原创粉丝点击