android 之ndk开发

1、Android NDK简介

NDK全称为native development kit本地语言(C&C++)开发包。而对应的是经常接触的Android-SDK,(software development kit)软件开发包(只支持java语言开发)。

简单来说利用NDK,可以开发纯C&C++的代码,然后编译成库,让利用Android-SDK开发的Java程序调用。NDK开发的可以称之为底层开发或者jni(java  native interface)层开发,SDK开发可以称为上层开发。

2、为何要用NDK

2.1、众所周知,利用SDK编写的代码,生成的APK,很容易就可以反编译了,安全性极为不高,而利用NDK开发的库,不容易被反编译,保密性,安全性都提高了。

2.2、很多开源工程和大型工程都是C&C++代码,把它们转换为纯java语言显然是不可能的。

2.3、C&C++的代码运行速度和效率都比java快很多。

3、NDK环境的搭建

http://developer.android.com/sdk/ndk/index.html下载最新版的NDK,然后解压到你喜欢的位置,然后把NDK的所在的目录,配置到环境变量里面就行。

如我在windows下面用cygwin开发。配置环境变量可以参考http://blog.csdn.net/conowen/article/details/7518870

简单来说就是在linux或者cygwin的安装目录,跳转到/home/YourName/,然后编辑.bash_profile文件,在末尾添加如下语句,具体根据自己的情况而定。

ndk=/home/conowen/android-ndk-r7b  
 
export ndk  

4、新建一个NDK工程

新建一个目录,命名为HelloWorld,然后在里面新建一个名为jni的目录(名称一定要是jni,因为ndk-build的时候会在HelloWorld目录下寻找jni的目录,然后进行build),在jni目录下新建如下文件HelloWorld.c和Android.mk。

HelloWorld.c文件代码如下(此JNI是没有jni_onLoad函数的)

#include <string.h>  
#include <jni.h>  
  
jstring  
Java_com_conowen_helloworld_HelloWorldActivity_helloWorldFromJNI( JNIEnv* env,  
                                                  jobject thiz )  
{  
    return (*env)->NewStringUTF(env, "HelloWorld! I am from JNI !");  
}  
  
  
  
  
 /*注意,这里 
 
jstring 表示返回值 
 
Java_com_conowen_helloworld_HelloWorldActivity_helloWorldFromJNI 
 
写法是Java+Android工程的包名+Android工程的Activity名+方法名,点号用下划线表示,这个写法很严格。 
包名:com_conowen_helloworld 
Activity名:HelloWorldActivity 
方法名:helloWorldFromJNI 
 
JNIEnv* env, jobject thiz是Native方法自带的参数,可以用来转换一个数据类型。也就是说其实这个helloWorldFromJNI是没有形参的。 
*/  

Android.mk代码如下

关于Android.mk的编写格式,下一篇博文补全

LOCAL_PATH := $(call my-dir)  
 
include $(CLEAR_VARS)  
#LOCAL_MODULE表示生成的库的名字,前面的lib和后缀名不用写  
LOCAL_MODULE    := HelloWorld  
LOCAL_SRC_FILES := HelloWorld.c  
 
include $(BUILD_SHARED_LIBRARY)  

然后在终端里面,转到HelloWorld目录下,执行

$ndk/ndk-build  

$ndk是之前配置的NDK环境变量。编译成功后,会在在目录生成libs和obj两个文件夹,libs里面有刚刚编译成的libHelloWorld.so库。

5、新建一个Android工程

在eclipse里面新建一个Android工程,java代码如下,然后把刚刚生成的libs文件夹拖到Android工程目录下。

package com.conowen.helloworld;  
 
import android.app.Activity;  
import android.os.Bundle;  
import android.widget.TextView;  
 
public class HelloWorldActivity extends Activity {  
 /** Called when the activity is first created. */ 
 @Override 
 public void onCreate(Bundle savedInstanceState) {  
 super.onCreate(savedInstanceState);  
 
        TextView tv = new TextView(this);  
        tv.setText(helloWorldFromJNI());  
        setContentView(tv);  
    }  
 
 public native String helloWorldFromJNI();// native声明,表示这个方法来自Native层。实现过程已经在native层实现了 
 
 static {  
        System.loadLibrary("HelloWorld");// 加载库,前面的lib和,后缀名不用写 
    }  
}  

效果图:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏冷冷

Spring 必知概念(二)

13、Spring框架中的单例Beans是线程安全的么? Spring框架并没有对单例bean进行任何多线程的封装处理。关于单例bean的线程安全和并发问题需要...

21790
来自专栏Android群英传

Andromeda:适用于多进程架构的组件通信框架(下)

11820
来自专栏Android开发与分享

【Android】Retrofit 2.0 的使用一、概述二、原理二、使用

一、概述 Retrofit是Square公司开发的一个类型安全的Java和Android 的REST客户端库。来自官网的介绍: A type-safe HTT...

43550
来自专栏Java成神之路

Spring_总结_02_依赖注入

在上一节中,我们了解了Spring的最根本使命、四大原则、六大模块以及Spring的生态。

8740
来自专栏JAVA高级架构

Java面试分享(题目+答案)

34230
来自专栏阿杜的世界

聊聊单元测试

单元测试(unit testing):是指对软件中的最小可测试单元进行检查和验证。

13910
来自专栏Java技术栈

给你一份超详细 Spring Boot 知识清单

在过去两三年的Spring生态圈,最让人兴奋的莫过于Spring Boot框架。或许从命名上就能看出这个框架的设计初衷:快速的启动Spring应用。因而Spri...

14620
来自专栏CSDN技术头条

给你一份超详细 Spring Boot 知识清单

在过去两三年的 Spring 生态圈,最让人兴奋的莫过于 Spring Boot 框架。Spring Boot 应用本质上就是一个基于 Spring 框架的应用...

64020
来自专栏扎心了老铁

zookeeper curator使用caches实现各种监听

1、篇首语 curator是zookeeper的一个高级api开发包。封装了zookeeper众多的recipes,并且实现了一些新的recipes原语,最重要...

57350
来自专栏Winter漫聊技术

初学Dagger之Hello Dagger(0)

写作背景 这几天在学习Dagger、MVP、Agera,这里所说的Dagger即Google接手的Dagger,也被称作Dagger 2。跟着demo与一些技...

8120

扫码关注云+社区

领取腾讯云代金券