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
再次运行,结果如图:
源代码下载
- Android C++笔记2-NDK详解
- NDK c函数详解
- Android NDK开发 Java与C互相调用实例详解
- Android NDK开发----- Java与C互相调用实例详解
- Android NDK开发----- Java与C互相调用实例详解
- Android NDK 配置文件详解
- Android NDK详解
- android NDK 详解
- Android NDK实例详解
- android NDK使用详解
- 【Android NDK】Android NDK学习-详解!
- Android NDK 调用C
- android ndk c编译
- Android Studio NDK(C++)
- Android NDK 学习笔记
- Android NDK学习笔记
- Android NDK学习笔记
- Android NDK Profiler 笔记
- 第十五周项目2-用哈希法组织关键字线性探测法
- 第十五周项目2-用哈希法组织关键字
- 1508-张晨曦总结《2016年-12月-7日》【连续47天总结】
- 常见的数据字典查询
- MMDBMS
- Android C++笔记2-NDK详解
- 第12周项目5 迷宫问题
- Ubuntu下反编译apk源码查看
- Coroutine,你究竟干了什么?
- Android:近期任务列表(Recent App)的两个知识点
- JSP的标签技术
- js,scrollTop的兼容性获取
- Dubbo 和 JDK 版本不匹配
- 第14周项目1-(4)验证平衡二叉树相关算法