在android ndk r7之后,已经不用下载安装Cygwin(模拟Linux环境),在以往的NDK开发中必须要下载,且需下载CDT(Eclipse C/C++开发插件),还要配置编译器,环境变量,等等。太过于麻烦。
一、介绍下NDK是什么东西
1.NDK是一系列工具的集合
NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。NDK集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。NDK可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作。
2.NDK提供了一份稳定、功能有限的API头文件声明
Google明确声明该API是稳定的,在后续所有版本中都稳定支持当前发布的API。从该版本的NDK中看出,这些API支持的功能非常有限,包含有:C标准库(libc)、标准数学库(libm)、压缩库(libz)、Log库(liblog)。
二、为什么使用NDK
1.代码的保护。由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。
2.可以方便地使用现存的开源库。大部分现存的开源库都是用C/C++代码编写的。
3.提高程序的执行效率。将要求高性能的应用逻辑使用C开发,从而提高应用程序的执行效率。
4.便于移植。用C/C++写得库可以方便在其他的嵌入式平台上再次使用。
三、下载NDK之后,解压便可
注:1.在android-ndk-r10c目录下有一个samples的目录,里面存放着例子,可供学习。
2.注意NDK的环境变量,如:
四、在Eclipse的Window->Preferences->Android->NDK,设置NDK路径,例如:
注:需检查ADT插件是否安装了Android Native Delelopment Tools(可在Eclipse - Help - Install new Software中检查)
**五、**新建一个Android工程后,在new出来的Project上右键点击Android Tools->Add Native Support…给库文件(.so)取个名字,如:hello
这时你会发现工程会多一个jni的文件夹,jni下有Android.mk和hello.cpp文件。
Android.mk是NDK工程的Makefile,hello.cpp就是NDK的源文件。
有关Android.mk文件的介绍:http://blog.csdn.net/gao_chun/article/details/44656169
六、我们在hello.cpp中写下如下代码,可以参考samples目录中的hello-jni例子。
#include <jni.h>
extern “C” {
JNIEXPORT jstring JNICALL Java_com_hello_Main_stringFromJNI(JNIEnv *env,
jobject thiz) {
return env->NewStringUTF(“Hello jni”);
}
}
C代码中是:
return (*env)->NewStringUTF(env,“Hello jni!”);
C++代码是:
return env->NewStringUTF(“Hello jni!”);
JNI接口的命名规范是:Java_ + 调用该方法的包名(包名的点用_代替) + _ + 调用该接口的类名 + _ + 方法名,对于实例方法,有两个参数是必要的,一个JNI的环境指针 JNIEnv *,另一个是调用该方法的Java实例 jobject
这里需要注意一点,按照如下的方式写,在程序运行后是报错的(注:是程序运行后会报错,不是该文件有错,该文件有错是因为java编辑器没有安装支持C/C++的插件所导致,在该文件编写完成后可以colse项目从新打开便可,或者clean):
报错信息如下:
**总结:使用extern "C"修饰,编译器会按C语言的方式编译和连接。在C语言中,函数编译之后函数名与C++函数编译之后不同,例如foo(int x, int y),C可能会编译成 _foo 的名字,而C++**因为支持重载,所以会编译成像 _foo_int_int 这种带参数的函数名。如果是按照C语言的编译方式,调用foo函数是找不到_foo的函数名就会报出函数名找不到的错误。所以要添加extern " C "修饰。
**七、**Main.java :
package com.hello;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class Main extends Activity {
//静态方法优先加载
static {
System.loadLibrary(“hello”);
}
//声明jni层的原生方法,使用native关键字
public native String stringFromJNI();
@Override
protected void onCreate(Bundle savedInstanceState) {
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门**
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!