上半年,公司的一个项目,本身我是不喜欢Android开发的,但是学习到的东西总需要整理一下。
从iOS转到Android,真心有些不习惯。就IDE来说,eclipse比Xcode差的不是一点半点。Android模拟器竟然还要开机!我勒个去。。
今天写个最简单的Android NDK的小栗子。
首先,什么是Android NDK? NDK 全称是:Native Development Kit,其他的,移步百度百科:android ndk_百度百科
1、新建一个Android Application Project,Fuck。
2、新建类 Fuck,声明本地静态方法:numFromFuck()。代码如下:
1 package com.example.fuck; 2 public class Fuck { 3 4 public native static int numFromFuck(); 5 6 static{ 7 8 System.loadLibrary("fuck"); //fuck代表动态链接库libfuck.so文件 9 10 } 11 12 }
3、给程序添加一个按钮button,在点击button时,通过调用类Fuck中本地方法更改textView的text,代码如下
1 button.setOnClickListener(new OnClickListener(){ 2 @Override 3 4 public void onClick(View arg0) { 5 6 // TODO Auto-generated method stub 7 8 textView.setText(Fuck.numFromFuck() + ""); 9 } 10 });
4、build该工程,生成 Fuck.class 类文件(在bin目录下),这一步比较重要。
5、在终端cd到工程目录下,新建个文件夹:【mkdir jni】(终端输入命令都在中括号中,下同),然后输入命令:【javah -classpath bin/classes -d jni com.example.fuck.Fuck】 ,
然后会在jni文件夹下发现一个文件:com_example_fuck_Fuck.h,其中代码如下:
1 /* DO NOT EDIT THIS FILE - it is machine generated */ 2 #include <jni.h> 3 4 /* Header for class com_example_fuck_Fuck */ 5 6 #ifndef _Included_com_example_fuck_Fuck 7 8 #define _Included_com_example_fuck_Fuck 9 10 #ifdef __cplusplus 11 12 extern "C" { 13 14 #endif 15 16 /* 17 18 * Class: com_example_fuck_Fuck 19 20 * Method: numFromFuck 21 22 * Signature: ()I 23 24 */ 25 26 JNIEXPORT jint JNICALL Java_com_example_fuck_Fuck_numFromFuck 27 28 (JNIEnv *, jobject); 29 30 #ifdef __cplusplus 31 32 } 33 34 #endif 35 36 #endif
6、在 jni 目录中新建Fuck.c,实现5中生成的.h文件中的方法:
1 #include "com_example_fuck_Fuck.h" 2 JNIEXPORT jint JNICALL Java_com_example_fuck_Fuck_numFromFuck (JNIEnv *env, jobject obj) 3 4 { 5 6 return 42; 7 8 }
如果你直接从.h文件拷过来的代码,一定要记得更改参数。
7、在 jni 文件目录中新建文件 Android.mk 文件:
1 LOCAL_PATH := $(call my-dir) 2 include $(CLEAR_VARS) 3 4 LOCAL_MODULE := fuck 5 6 LOCAL_SRC_FILES := Fuck.c 7 8 include $(BUILD_SHARED_LIBRARY)
LOCAL_MODULE:=fuck 表示要生成的so文件名为:libfuck.so,这就是在步骤2中需加载的动态链接库。
8、回到终端,cd 到工程目录,输入命令:【ndk-build】,没错的话会在工程目录 libs/armeabi 中生成文件:libfuck.so。
最后运行程序:
点击按钮button,textView的内容就会变成“42”。
over~
2014-03-08