




已阅读5页,还剩20页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Android NDK开发篇(一):新版NDK环境搭建(免Cygwin,超级快)以前做Android的项目要用到NDK就必须要下载NDK,下载安装Cygwin(模拟Linux环境用的),下载CDT(Eclipse C/C+开发插件),还要配置编译器,环境变量.麻烦到不想说了,Shamoo在网上查了一下资料,发现了一个超级快配置NDK的办法。Step1:到Android官网下载Android的开发工具ADT(Android Development Tool的缩写),该工具集成了最新的ADT和NDK插件以及Eclipse,还有一个最新版本SDK。解压之后就可以用了,非常爽!ADT插件:管理Android SDK和相关的开发工具的NDK插件:用于开发Android NDK的插件,ADT版本在20以上,就能安装NDK插件,另外NDK集成了CDT插件也可以在线更新ADT、NDK插件,不过速度超级慢.所以果断在网上下载集成开发工具ADT,下载链接见:/sdk/index.htmlStep2:到Android官网下载最新的NDK,注:NDK版本在r7以上之后就集成了Cygwin,而且还是十分精简版。比起下载Cygwin要方便多啦!下载链接见:/tools/sdk/ndk/index.html下载完成之后,解压搞定!Step3:打开Eclipse,点Window-Preferences-Android-NDK,设置NDK路径,例如Shamoo的是E:android-ndk-r9cStep4:新建一个Android工程,在工程上右键点击Android Tools-Add Native Support.,然后给我们的.so文件取个名字,例如:my-ndk这时候工程就会多一个jni的文件夹,jni下有Android.mk和my-ndk.cpp文件。Android.mk是NDK工程的Makefile,my-ndk.cpp就是NDK的源文件。Step5:接下来仿着NDK的demo,Hello-JNI工程写一下。使用Alt + /可以代码提示!很爽!有木有?之前用CDT时候死活都按不出代码提示,郁闷.JNI接口的命名规范是:Java_ + 调用该方法的包名(包名的点用_代替) + _ + 调用该接口的类名 + _ + 方法名,对于实例方法,有两个参数是必要的,一个JNI的环境指针JNIEnv *,另一个是调用该方法的Java实例jobjectmy-ndk.cpp:#include JNIEXPORT jstring JNICALL Java_com_shamoo_activity_TestActivity_stringFromJNI(JNIEnv *env,jobject thiz) return env-NewStringUTF(Hello jni);TestActivity.java:public class TestActivity extends Activity static System.loadLibrary(my-ndk);/ 声明JNI层的原生方法,使用native关键字public native String stringFromJNI();Overrideprotected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);TextView tvText = new TextView(this);tvText.setText(stringFromJNI();setContentView(tvText);使用ndk库必须在static代码块里面用System.loadLaibrary加载.so库Step6:完成了,然后运行。运行之前先编译NDK,然后在编译JAVA代码。编译也许会遇到Unable to launch cygpath. Is Cygwin on the path?错误,解决办法如下:1.工程右键,点Properties-C/C+ Build的Building Settings中去掉Use default build command,然后输入$NDKROOT/ndk-build.cmd2.在C/C+ Build中点击Environment,点Add.添加环境变量NDKROOT,值为NDK的根目录3.再编译,问题就解决啦!运行时崩溃,遇到java.lang.UnsatisfiedLinkError: stringFromJNI错误,解决办法:在C+文件中函数定义前添加extern C修饰extern C JNIEXPORT jstring JNICALL Java_com_shamoo_activity_TestActivity_stringFromJNI(JNIEnv *env,jobject thiz);JNIEXPORT jstring JNICALL Java_com_shamoo_activity_TestActivity_stringFromJNI(JNIEnv *env,jobject thiz) return env-NewStringUTF(Hello jni);原因是:使用extern C修饰,编译器会按C语言的方式编译和连接。在C语言中,函数编译之后函数名与C+函数编译之后不同,例如foo(int x, int y),C可能会编译成_foo的名字,而C+因为支持重载,所以会编译成像_foo_int_int这种带参数的函数名。如果是按照C语言的编译方式,调用foo函数是找不到_foo的函数名就会报出函数名找不到的错误。所以要添加extern C修饰。Eclipse下NDK开发一、关于NDK: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)。二、NDK实例的实现:对于Windows环境下NDK的开发,如果使用的NDK是r7之前的版本,必须要安装Cygwin才能使用NDK,所以为Eclipse需要配置的builder,其实是执行Cygwin,然后传递ndk-build作为参数。在NDKr7开始,Google的Windows版的NDK提供了一个ndk-build.cmd的脚本,这样,就可以直接利用这个脚本编译,而不需要使用Cygwin了。只需要为EclipseAndroid工程添加一个Builders,就能让Eclipse自动编译NDK。本文是讲述NDK-r7下的实现实例。下面是使用NDK-r7在windows下配置自动编译的builders的过程(实际上对于Linux,只需要修改ndk-build.cmd为ndk-build就可以了。)。(1)先下载安装NDK-r7。下载地址:/sdk/ndk/index.html下载后解压缩就可以用了。(2)打开Eclipse,新建一个Android工程(我的取名为TestNdk),在工程目录TestNdk下新建jni文件夹,该文件夹就用来保存NDK需要编译的文件代码等。(3)新建并配置一个Builder:(a)Project-Properties-Builders-New,新建一个Builder。(b)在弹出的【Choose configuration type】对话框,选择【Program】,点击【OK】:(c)在弹出的【Edit Configuration】对话框中,配置选项卡【Main】。在“Name“中输入新builders的名称(我取名为Ndk_Builder)。在“Location”中输入nkd-build.cmd的路径。(我的是D:AndroidDevandroid-ndk-r7ndk-build.cmd,根据各自的ndk路径设置,也可以点击“Browser File System”来选取这个路径)。在“Working Diretcoty”中输入$workspace_loc:/TestNdk(也可以点击“Browse Workspace”来选取TestNdk目录)。(d)【Edit Configuration】对话框中,配置选项卡【Refresh】。勾选“Refresh resources upon completion”,勾选“The entire workspace”,勾选“Recuresively include sub-folders”。(e)【Edit Configuration】对话框中,配置选项卡【Build options】。勾选“After a “Clean”,勾选“During manual builds”,勾选“During auto builds”,勾选“Specify working set of relevant resources”。点击“Specify Resources”勾选TestNdk工程的“jni“目录,点击”finish“。点击“OK“,完成配置。OK,到这里Eclipse就能够自动调用NDK编译jin目录下的C/C+代码了。(4)在TestNdk工程中新建一个JniClient.class(为了调用C/C+代码),其内容如下:package com.ndk.test;public class JniClient static public native String AddStr(String strA, String strB);static public native int AddInt(int a, int b);(5)用cmd命令定位到JniClient.class 所在目录,输入“javac JniClient.java“后回车,生成JniClinet.class文件(如果是用的Eclipse建的工程,在TestNdkbinclassescomndktest目录下就已经有JniClinet.class文件了)。(6)将JniClinet.class拷贝到TestNdkbinclassescomndktest目录,将cmd命令定位到TestNdkbinclasses目录,输入”javah com.ndk.test.JniClient“后回车,在TestNdkbinclasses目录下就生成了C+头文件com_ndk_test_JniC_ndk_test_JniClient.h的文件内容如下:/* DO NOT EDIT THIS FILE - it is machine generated */#include /* Header for class com_ndk_test_JniClient */#ifndef _Included_com_ndk_test_JniClient#define _Included_com_ndk_test_JniClient#ifdef _cplusplusextern C #endif/* Class: com_ndk_test_JniClient* Method: AddStr* Signature: (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;*/JNIEXPORT jstring JNICALL Java_com_ndk_test_JniClient_AddStr(JNIEnv *, jclass, jstring, jstring);/* Class: com_ndk_test_JniClient* Method: AddInt* Signature: (II)I*/JNIEXPORT jint JNICALL Java_com_ndk_test_JniClient_AddInt(JNIEnv *, jclass, jint, jint);#ifdef _cplusplus#endif#endif(7)在jni目录下新建一个Android.mk文件,其内容如下(详细的语法以后再另外解释):LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := TestNdkLOCAL_SRC_FILES := com_ndk_test_JniClient.cinclude $(BUILD_SHARED_LIBRARY)(8)将com_ndk_test_JniClient.h拷贝到TestNdk工程的jni目录下, 然后新建一个com_ndk_test_JniClient.c文件完成头文件中函数的实现,其内容如下(本来Java_com_ndk_test_JniClient_AddStr是想完成字符串相加的功能的,但数据转换有点问题,想先写完本文档,后续再研究jni数据类型的问题,所以只简单的返回一个字符串。):#include com_ndk_test_JniClient.h#include #include #ifdef _cplusplusextern C#endif/* Class: com_ndk_test_JniClient* Method: AddStr* Signature: (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;*/JNIEXPORT jstring JNICALL Java_com_ndk_test_JniClient_AddStr(JNIEnv *env, jclass arg, jstring instringA, jstring instringB)jstring str = (*env)-NewStringUTF(env, HelloWorld from JNI !);return str;/* Class: com_ndk_test_JniClient* Method: AddInt* Signature: (II)I*/JNIEXPORT jint JNICALL Java_com_ndk_test_JniClient_AddInt(JNIEnv *env, jclass arg, jint a, jint b)return a + b;#ifdef _cplusplus#endif编辑com_ndk_test_JniClient.c并保存后,可以看到TestNkd工程下的obj/local/armeabi目录下将自动生成libTestNdk.so库。(9)在TestNdkActivity.java中完成对JniClient.java中函数的调用:package com.ndk.test;import android.app.Activity;import android.os.Bundle;import android.widget.TextView;public class TestNdkActivity extends Activity static System.loadLibrary(TestNdk);/* Called when the activity is first created. */Overridepublic void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);/ setContentView(R.layout.main);String str = JniClient.AddStr(prefix, suffix);int iSum = JniClient.AddInt(5, 2);String strSum = 5 + 7 = + iSum;TextView tv1 = new TextView(this);tv1.setText(str);setContentView(tv1);(10)运行TestNdk工程,在模拟器中可以看到界面输出来自com_ndk_test_JniClient.c 文件中的“HelloWorld from JNI ! “。OK,NDK实例到此完成。后续就可以深入的学习NDK/JNI了,比如C/C+与Java的数据类型转换,Android.mk文件的编写格式等。Eclipse下NDK调试C+代码转载/download/bigmaxim/54740551. 相关软件adt-bundle-windows-x86.zip - Eclipse集成ADT插件,需要联网安装相应的Android SDK。jdk-6u43-windows-i586.exe - JDK6Eclipse运行需要JAVA环境,编译ANDROID应用也需要JAVA编译器。android-ndk-r8e-windows-x86.zip - NDK r8e,支持在ANDROID应用中用C语言进行开发。说明:ndk-build可以不需要cygwin环境。Cygwin -使用ndk-gdb调试C源码,需要Cygwin环境的支持。2. WinXP系统环境变量配置ADB_PATH=D:GreenProgramadt-bundle-windows-x86sdkplatform-toolsclasspath=.;%JAVA_HOME%lib;%JAVA_HOMElibtools.jarCYGWIN_BIN=C:cygwinbinECLIPSE_PATH=D:GreenProgramadt-bundle-windows-x86eclipseJAVA_HOME=C:Program FilesJavajdk1.6.0_43NDK_ROOT=D:GreenProgramadt-bundle-windows-x86android-ndk-r8ePath=%JAVA_HOME%bin;%JAVA_HOME%jrebin;%NDK_ROOT%;%ADB_PATH%;%CY
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 松脂工应急处置考核试卷及答案
- 放射性金属矿脱盐工艺考核试卷及答案
- 缝制机械安装效率工艺考核试卷及答案
- 电动工具定转子制造工质量管控考核试卷及答案
- 河北省石家庄市第三十八中学2025-2026学年九年级上册开学数学试题含答案
- 三年及五年以上有期徒刑剥夺政治权利测试卷含答案
- 银行业从业试题及答案
- 超声专业招聘试题及答案
- 社区护理专业试题及答案
- 考研材料专业试题及答案
- 轨道交通课说课课件
- 超声科法律法规与工作规范
- 企业购电计划方案(3篇)
- 星级酒店室内装修施工合同
- 小学中国新疆课件教学
- 乒乓球基础知识简介课件
- 肾小球肾炎课件
- 2025光伏发电建设项目文件归档与档案规范
- 微创祛除腋臭术后护理
- 地产直播 培训课件
- 中医肺与大肠教学讲课件
评论
0/150
提交评论