Android NDK 即:Native Development Kit 。众所周知,Android程序运行在Dalvik虚拟机中,NDK允许用户使用类似C / C++之类的原生代码语言执行部分程序。
NDK包括了:
-
1.从C / C++生成原生代码库所需要的工具和build files。
-
2.将一致的原生库嵌入可以在Android设备上部署的应用程序包文件(application packages files ,即.apk文件)中。
-
3.支持所有未来Android平台的一系列原生系统头文件和库
- 使用到NDK主要分为以下几种情况:
1. 代码的保护,由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。
2. 在NDK中调用第三方C/C++库,因为大部分的开源库都是用C/C++代码编写的。
3. 便于移植,用C/C++写的库可以方便在其他的嵌入式平台上再次使用。
值得注意的是:严格说AndroidNDK只是AndroidSDK的一个组件,通过NDK,你就可以用c或c++来开发app了。我觉得把两个都弄熟是最好的。下面我来教大家怎么配置环境:
- 首先,需要去下载NDK,网址:http://developer.android.com/ndk/downloads/index.html 或者 http://github.com/inferjay/AndroidDevTools/blob/3e627cea30a91f721c79c480c7ba89c80c8f558a/README.md
- 然后去eclipse里面进行环境配置:Window--->Prefrences--->Android--->LogCat--->NDK--->将路径添加上然后应用就可以了,即:
- 接下来去配置头文件:windows--->搜cmd,进入命令提示符进入
- 这时候刷新一下项目,可以看见在MainActivity所在的包下面多了一个后缀名为.h的文件,这时候可以将DNK添加到你所在项目中,添加方式为:选中项目-->右键选择Android Tools-->Add Native Support...刷新一下项目,这时候你会发现项目中多了一个jni文件夹,将刚刚生成的.h文件剪切到该文件夹下。然后:
- 将.mk文件夹里面的按照下面修改:
- 然后:
- .C文件中:
- 下面我将详细代码展示一下
- 带有native的关联c的类
<span style="font-family:SimSun;">public class Hello { public static native String getString(); } </span>
- MainActivity:
<span style="font-family:SimSun;">public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); System.loadLibrary("Demo"); } public void callc(View view){ String string = Hello.getString(); System.out.println(string); } } </span>
- jni中的.c文件
<span style="font-family:SimSun;">#include <jni.h> #include <Stdio.h> #include <stdlib.h> JNIEXPORT jstring JNICALL Java_com_example_ndkdemo_Hello_getString (JNIEnv *env, jclass obj){ return (*env)->NewStringUTF(env,"hello"); }</span>
- Android.mk文件
<span style="font-family:SimSun;">LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := Demo LOCAL_SRC_FILES := Demo.c include $(BUILD_SHARED_LIBRARY) </span>
- jni中的.h文件
<span style="font-family:SimSun;">/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_example_ndkdemo_Hello */ #ifndef _Included_com_example_ndkdemo_Hello #define _Included_com_example_ndkdemo_Hello #ifdef __cplusplus extern "C" { #endif /* * Class: com_example_ndkdemo_Hello * Method: getString * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_example_ndkdemo_Hello_getString (JNIEnv *env, jclass class); #ifdef __cplusplus } #endif #endif</span>
- 这样就能实现简单的sdk与ndk之间的通信了。
不足之处望多多指正!