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 := Hello
LOCAL_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 __cplusplus
extern "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);//打印“你好”
}
}