Android NDK简单实例和环境搭建

来源:互联网 发布:淘宝 全球买手 直播 编辑:程序博客网 时间:2024/06/05 20:42

1.NDK和JNI简介:

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

(software development kit)软件开发包(只支持java语言开发)。

众所周知,Android程序运行在Dalvik虚拟机中,NDK允许用户使用类似C / C++之类的原生代码语言执行部分程序。
NDK包括了
  • 从C / C++生成原生代码库所需要的工具和build files。
  • 将一致的原生库嵌入可以在Android设备上部署的应用程序包文件(application packages files ,即.apk文件)中。
  • 支持所有未来Android平台的一系列原生系统头文件和库
为何要用到NDK?
概括来说主要分为以下几种情况:
1. 代码的保护,由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。
2. 在NDK中调用第三方C/C++库,因为大部分的开源库都是用C/C++代码编写的。
3. 便于移植,用C/C++写的库可以方便在其他的嵌入式平台上再次使用。

JNI全称为Java Native Interface(JAVA本地调用)。从Java1.1开始,JNI成为java平台的一部分,它允许Java代码和其他语言写的代码(如C&C++)进行交互。并非从Android发布才引入JNI的概念的。
简单来说,Android的NDK提供了一些交叉编译工具链和Android自带的库,这些Android的库可以让开发者在编写本地语言的程序时调用。而NDK提供的交叉编译工具链就对已经编写好的C&C++代码进行编译,生成库。当然了,你也可以自己搭建交叉编译环境,而不用NDK的工具和库。然后生成库,只要规范操作,一样可以生成能让JAVA层成功调用的库文件的。
二:NDK环境搭建
1.下载Android NDK  http://developer.android.com/tools/sdk/ndk/index.html 

我是用的NDK:

2.Eclipse配置




3.创建你的Android项目,里面创建一个java类,代码如下:
package com.example.ndkdemo;public class Hello {//native 是NDK的关键词public static native String getString();}
4.通过javah生成头文件,在命令提示符下操作:


刷新你的项目,得到如图的一个包


右键你的项目,创建一个名字,生成jni文件夹






Android.mk里面的代码如下:

-LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE    := HelloLOCAL_SRC_FILES := Hello.c//这个是把 .cpp 后面的 pp 给删除了  剩下的代码不变include $(BUILD_SHARED_LIBRARY)

头文件 com_example_nn_Hello.h 的代码如下:
/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class com_example_nn_Hello */#ifndef _Included_com_example_nn_Hello#define _Included_com_example_nn_Hello#ifdef __cplusplusextern "C" {#endif/* * Class:     com_example_nn_Hello * Method:    getString * Signature: ()Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_com_example_nn_Hello_getString(JNIEnv *  env, jclass class);//这里改成这样的#ifdef __cplusplus}#endif#endif

 后缀为 Hello.c文件需做如下操作:
先去解压的NDK找到 这个路径
C:\Users\ti\Desktop\android-ndk-r9\platforms\android-18\arch-arm\usr\include



 
 上方关联之后 写 Hello.c中的代码如下
#include <jni.h>#include <Stdio.h>#include <stdlib.h>JNIEXPORT jstring JNICALL Java_com_example_ndkdemo_Hello_getString  (JNIEnv *env, jobject obj){return (*env)->NewStringUTF(env,"你好");}

MainActivity中的代码:
package com.example.ndkdemo;import android.os.Bundle;import android.app.Activity;import android.view.Menu;import android.view.View;public class MainActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        System.loadLibrary("NDKdemo");//jni中后缀为.c的名字    }public void cc(View v){ //他是一个按钮,点击按钮需要做的操作String string = Hello.getString();System.out.println(string);//打印“你好”}   }  

































3 0
原创粉丝点击