Android 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) {

super.onCreate(savedInstanceState);

TextView tv = new TextView(this);

tv.setText(stringFromJNI());

setContentView(tv);

}

}

注:static代码块里面用System.loadLaibrary加载的是编译器编译完成后的.so库,并非hello.cpp文件。

**八、**完成,运行就ok。

最后

其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

上面分享的腾讯、头条、阿里、美团、字节跳动等公司2019-2021年的高频面试题,博主还把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,上面只是以图片的形式给大家展示一部分。

【Android思维脑图(技能树)】

知识不体系?这里还有整理出来的Android进阶学习的思维脑图,给大家参考一个方向。

【Android高级架构视频学习资源】

**Android部分精讲视频领取学习后更加是如虎添翼!**进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!

参考docs.qq.com/doc/DSkNLaERkbnFoS0ZF

**Android部分精讲视频领取学习后更加是如虎添翼!**进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!

参考docs.qq.com/doc/DSkNLaERkbnFoS0ZF

  • 16
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值