Android开发基础(2.1)--NDK 的搭建和基本用法
2011-02-26 16:02
603 查看
I.NDK配置和基本使用
NDK简介见前篇。较新的NDK都无需配置,下载解压后即可使用。关键是不同版本的NDK开放的API不同,常用的是 r4和r5,后者面向Android 2.2+, 支持UI/图形/声音的部分C接口,还有STL的支持(遗憾的是r5中的STL没整出来)。由于我面向的平台是2.1的,所以,我用的是 r4c。
这里就提到的关键一点了,那个NDK是真正配置好的完全支持C++(包括STL)的?网上比较有名的是Crystax NDK r4,
我用的是Mozilla 为开发Android Firefox开发而使用的NDK r4c(与Crystax类似),下载地址是:
http://ftp.mozilla.org/pub/mozilla.org/mobile/source/android-ndk-r4c-0moz3.tar.bz2
具体如何修改自己的NDK我后面再说。
1.NDK的基本使用
这里说的基本使用,就是利用现有的NDK工具生成供SDK JAVA通过JNI调用的共享C库(lib**.so)
以上篇的工程Helloworld为例,在工程文件夹下:
#mkdir jni
#cd jni
至少要创建Android.mk和helloworld.c,例如:
Android.mk
这是个NDK要使用的小型Makefile,更多的选项可以看 $NDK/docs/* 内的相关文档。
helloworld.c 遵从一般JNI代码的规定:
注意C++代码里面要加上 extern "C",防止C++的名称修饰使得JNI无法找到函数名。命名规则就是:Java_project_name_Activity_class_name_func_name.
编译生成,采用的是NDK封装好的脚本ndk-build, 在$NDK主文件夹下,使用很简单,在工程主文件夹
下执行:(假设$NDK已经加入到$PATH)
#ndk-build
...
即可,若成功,则主文件夹的 libs/armeabi 或者libs/arm-v7te 下生成
libhelloworld.so
2.SDK中使用NDK生成的文件
修改src/my/helloworld/Helloworld.java,使之通过JNI调用C函数:
其中先加载libhelloworld.so,再调用其内的hellow()函数。
#ant debug
重建工程
#adb install ./bin/Helloworld-debug.apk
安装到设备上,运行如下:
NDK简介见前篇。较新的NDK都无需配置,下载解压后即可使用。关键是不同版本的NDK开放的API不同,常用的是 r4和r5,后者面向Android 2.2+, 支持UI/图形/声音的部分C接口,还有STL的支持(遗憾的是r5中的STL没整出来)。由于我面向的平台是2.1的,所以,我用的是 r4c。
这里就提到的关键一点了,那个NDK是真正配置好的完全支持C++(包括STL)的?网上比较有名的是Crystax NDK r4,
我用的是Mozilla 为开发Android Firefox开发而使用的NDK r4c(与Crystax类似),下载地址是:
http://ftp.mozilla.org/pub/mozilla.org/mobile/source/android-ndk-r4c-0moz3.tar.bz2
具体如何修改自己的NDK我后面再说。
1.NDK的基本使用
这里说的基本使用,就是利用现有的NDK工具生成供SDK JAVA通过JNI调用的共享C库(lib**.so)
以上篇的工程Helloworld为例,在工程文件夹下:
#mkdir jni
#cd jni
至少要创建Android.mk和helloworld.c,例如:
Android.mk
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := helloworld #库名称 LOCAL_SRC_FILES := helloworld.c #源文件 include $(BUILD_SHARED_LIBRARY) #生成共享库
这是个NDK要使用的小型Makefile,更多的选项可以看 $NDK/docs/* 内的相关文档。
helloworld.c 遵从一般JNI代码的规定:
#include <jni.h> jstring Java_my_helloworld_Helloworld_hello( JNIEnv* env, jobject thiz ) { return (*env)->NewStringUTF(env, "Hello World from JNI !"); }
注意C++代码里面要加上 extern "C",防止C++的名称修饰使得JNI无法找到函数名。命名规则就是:Java_project_name_Activity_class_name_func_name.
编译生成,采用的是NDK封装好的脚本ndk-build, 在$NDK主文件夹下,使用很简单,在工程主文件夹
下执行:(假设$NDK已经加入到$PATH)
#ndk-build
...
即可,若成功,则主文件夹的 libs/armeabi 或者libs/arm-v7te 下生成
libhelloworld.so
2.SDK中使用NDK生成的文件
修改src/my/helloworld/Helloworld.java,使之通过JNI调用C函数:
import android.app.Activity; import android.widget.TextView; import android.os.Bundle; public class Helloworld extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView tv = new TextView(this); tv.setText(hello()); setContentView(tv); } public native String hello(); static { System.loadLibrary("helloworld"); } }
其中先加载libhelloworld.so,再调用其内的hellow()函数。
#ant debug
重建工程
#adb install ./bin/Helloworld-debug.apk
安装到设备上,运行如下:
![](http://hi.csdn.net/attachment/201102/28/0_1298856146atZ2.gif)
相关文章推荐
- Android-NDK开发之基础--Android.mk的用法和基础
- Android-NDK开发之基础--Android.mk的用法和基础(转CSDN)
- Android-NDK开发之基础--Android.mk的用法和基础(转CSDN)
- Android-NDK开发之基础--Android.mk的用法和基础(转CSDN)
- [置顶] Android开发之数据存储——SharedPreferences基础知识详解,饿补学会基本知识,开发者必会它的用法。
- Android开发基础(2.2)--利用NDK搭建自己的Android交叉工具链
- Android的ndk开发环境的搭建
- Android网络开发之OkHttp--基本用法POST
- win 7+ android +ndk+ opencv开发环境搭建
- Android开发之PathMeasure的基本用法
- Ubuntu下搭建 Eclipse+NDK for Android JNI 的开发环境
- Android:Windows 下搭建NDK-JNI开发环境
- Android开发笔记:基础控件之RadioGroup用法
- android Jni NDK开发环境搭建及其简单实例的编写
- 史上最易懂的Android jni开发资料--NDK环境搭建
- 【NDK开发】android-ndk r10环境搭建
- [Android NDK/JNI-1A]-开发环境搭建
- Android jni开发资料--NDK环境搭建
- sdk+ndk+eclipse搭建android开发环境
- 使用Android NDK开发(二):搭建Android NDK开发环境(android-ndk-r10+eclipse+NDK plugin,不需安装Cygwin)