最近,在学习android ndk开发,配置环境的时候遇到了些问题,总算不负有心人……在这里记录哈过程,与筒子们分享哈……想学NDK的筒子们有福啦……
教程本人亲测,非copy的……
如有什么不明白的地方,可以留言
大神也可以进来瞧瞧有什么不对的地方,请指教两招
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
NDK是一个工具集,可让您实现您的应用程序使用本机代码的语言,如C和C + +。Android NDK 是在SDK前面又加上了“原生”二字,即Native Development Kit,因此又被Google称为“NDK”。
在此之前,Android平台的第三方应用程序均是依靠基于Java的Dalvik特制虚拟机进行开发的。原生SDK的公布可以让开发者更加直接的接触Android系统资源,并使用传统的C或C++语言编写程序,并在程序封包文件(.apks)中直接嵌入原生库文件。
NDK的公布可以让开发者更加直接的接触Android系统资源,并使用传统的C或C++语言编写程序,并在程序封包文件(.apks)中直接嵌入原生库文件。NDK的公布让原来从事C语言开发者也参与到Android平台,也让java开发者方便的调用底层操作,特别是游戏开者,对引擎,速度等要求较高者,有了新的工具来实现所需功能,做出更加完美的程序。
对于某些类型的应用程序,这可以是有益的,所以你可以重用现有的代码库,这些语言编写的,但大多数应用程序不需要NDK。
Android NDK R9 主要是为了Android 4.3开发准备的。
随着Android 4.3平台的发布,谷歌还发布了Android NDK (r9)的更新版本。新的NDK允许你本地访问Android 4.3中的OpenGL ES 3.0 API以及其他稳定的API。如果你在游戏或应用中使用了高性能图形功能,可以采用该版本。
Android NDK全称:Native Development Kit,即本地开发包。
1、NDK是一系列工具的集合。
NDK提供了一系列的工具,这些工具对开发者的帮助是巨大的。它们能帮助开发者快速开发C(或C++)的动态库,并能自动将so库和java应用一起打包成apk。
NDK集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so库。NDK可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作。
2、NDK提供了一份稳定、功能有限的API头文件声明。Google明确声明该API是稳定的,在后续所有版本中都稳定支持当前发布的API。从该版本的NDK中看出,这些API支持的功能非常有限,包含有:C标准库(libc)、标准数学库(libm)、压缩库(libz)、Log库(liblog)。
对于Windows环境下NDK的开发,如果使用的NDK是r7之前的版本,必须要安装Cygwin才能使用NDK;从r7开始,Google的提供了一个ndk-build.cmd的脚本,可以直接用它编译,而不需要使用Cygwin了。可以通过,配置path变量,直接在cmd下面运行ndk-build命令即可对android工程中的项目进行编译了。
1,JAVA_HOME : C:\Program Files (x86)\Java\jdk1.7.0_17 (jdk的安装目录)
2,CLASSPATH: .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar (固定不变)
3,ANDROID_NDK_HOME: D:\android-ndk-r9d (ndk的解压的目录)
4,PATH: 将这 “%JAVA_HOME%\bin; %ANDROID_NDK_HOME%;”加到原有的后面。
5,test
在 cmd 中 输入 java –version,ndk-build –h ,没有出现
“xxx不是内部或外部命令”即成功
Android NDK开发教程(请按照教程顺序操作,本人亲测)
工具环境(Android Developer Tools,android-ndk-r9d,Android4.3 API18)
1, 在 ant中(eclipse),新建一个android项目(NDKhi)。
2, 在 src下的com.example.ndkhi 新建 jniClient.java 文件。
此文件作用:
1,加载本地C库文件(.so)。
2,声明本地C库中的方法(static public native String sayHi())。
jniClient.java源码:
package com.example.ndkhi;
public class jniClient {
static {
System.loadLibrary("Ndkhi");
}
static public native String sayHi();
}
3, 编译android文件
eclipse默认自动编译。在目录 workspace\NDKhi\bin\classes\com\example\ndkhi 中 查找 jniClient.class 文件是否存在,若不存在,手动编译android工程。
4, 使用 javah 工具 生成 c语言的.h头文件
在 工程NDKhi 中建立一个 名为 jni 的文件夹,打开window cmd,cd到jni目录下,
输入 javah –classpath ../bin/classes/com.example.ndkhi ,若命令执行成功,会在jni目录中生成 com_example_ndkhi_jniClient.h 文件。
刷新 eclipse中的工程NDKhi,即可见com_example_ndkhi_jniClient.h 文件。
com_example_ndkhi_jniClient.h源码(此文件为自动生成,一般不用修改):
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_ndkhi_jniClient */
#ifndef _Included_com_example_ndkhi_jniClient
#define _Included_com_example_ndkhi_jniClient
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_example_ndkhi_jniClient
* Method: sayHi
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_ndkhi_jniClient_sayHi
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
5, 编写c语言程序
在jni目录下,新建 名为 com_example_ndkhi_jniClient..c 的文件,实现 com_example_ndkhi_jniClient.h中声明的函数即可。
com_example_ndkhi_jniClient..c源码:
#include <com_example_ndkhi_jniClient.h>
JNIEXPORT jstring JNICALL Java_com_example_ndkhi_jniClient_sayHi
(JNIEnv *env, jclass arg)
{
return (*env)->NewStringUTF(env, "android ndk hi!!!");
}
6,Android.mk 文件(简单理解为 makefile)
在 jni目录下,新建 名为Android.mk 文件。
内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := Ndkhi
LOCAL_SRC_FILES := com_example_ndkhi_jniClient.c
include $(BUILD_SHARED_LIBRARY)
修改xxx.c文件,和 Ndkhi 为自己新建的.c文件,的要生成的.so
7, 编译,链接C程序
打开windows cmd,cd到 workspace\NDKhi 目录下,输入 ndk-build 命令
若成功如下图:
编译链接成功后,会在 工程NDKhi的libs/armeabi/下 生成 libNdkhi.so,
8, 编写MainActivity.java。
源码:
package com.example.ndkhi;
import android.os.Bundle;
import android.R.string;
import android.app.Activity;
import android.view.Menu;
import android.widget.TextView;
public class MainActivity extends Activity {
private TextView tView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tView = (TextView) findViewById(R.id.tv);
String strHi = jniClient.sayHi();
tView.setText(strHi);
}
}
9,运行android 工程 NDKhi
大功告成!!!
http://download.csdn.net/detail/gaoxin12345679/7841117
原文地址:http://blog.csdn.net/gaoxin12345679/article/details/38930879