1.NDK开发环境搭建
(1).下载对应版本的NDK
android-ndk-r9-windows-x86.zip下载
(2).cygwin下载安装
首先下载cygwin,只需要安装其中的Devel和Shells即可,找到刚下载的ndk-build所在的目录文件,为了像在cmd中自由使用java命令那样,自由使用ndk-build命令,需要为cygwin配置path环境变量,需要配置profile文件,添加path路径,可参考如下。
PATH="/usr/local/bin:/cygdrive/d/zf/Android-ndk-r7b:/usr/bin:${PATH}"在新版本的NDK已经支持windows下的编译,提供了一个ndk-build.cmd,故该步骤可以忽略。
2.简单的helloC
(1).在Activity中声明方法
//注意:不要在helloFromC()后面加上{}public native String helloFromC();(2).定义c文件
需要在android项目中新建一个jni文件夹,在jni中新建一个Hello.c文件,代码如下
/* * 函数的命名需要遵循一定的规范,Java_完整的包名(以_隔开)_函数名 */JNIEXPORT jstring JNICALL Java_com_example_ndk_MainActivity_helloFromC (JNIEnv * env, jobject obj){ return (*env)->NewStringUTF(env, "form helloFromC");}(3).新建Android.mk文件
LOCAL_PATH := $(call my-dir) #调用命令,找到路径include $(CLEAR_VARS) #清空变量LOCAL_MODULE := Hello #将会以该名字,在libs/armeabi/libHello.so,即lib<LOCAL_MODULE>.soLOCAL_SRC_FILES := Hello.c #使用的c文件include $(BUILD_SHARED_LIBRARY)(4). 使用ndk-build编译
可以使用cygwin或者在windows cmd下的ndk-build.cmd,首先cd进入当前android项目所在的目录,然后调用ndk-build命令编译
(5).引入libs
在完成编译后,会产生libs/armeabi/libHello.so,为引入该so可执行文件,需要在activity中使用静态代码库引入
static{ /* * libs/armeabi/libHello.so,loadLibrary()的name为lib<name>.so指定 * 即在Android.mk指定的LOCAL_MODULE后面值 */ System.loadLibrary("Hello");}
3.得到native的签名文件
自己手写该方法可能会出错,尤其是native的方法很复杂,比如hello_from_c();有下划线,为此正确的做法应该使用jdk下的javah命令,让其帮助我们生成对应的头文件。
(1).进入Android目录
在windows下,使用cmd进入android项目中,然后进入src目录,键入如下
javah com.baidu.MainActivity //完整路径(含包名)(2). 拷贝并引入头文件,实现相应方法
在调用了javah命令后,会在当前目录下生成一个com_baidu_MainActivity.h文件,将其拷贝至jni目录下,引入并实现
#include <stdio.h>#include "com_baidu_MainActivity.h"JNIEXPORT jstring JNICALL Java_com_example_ndk_MainActivity_helloFromC (JNIEnv * env, jobject obj){ return (*env)->NewStringUTF(env, "form helloFromC");}
4.其它
(1).c返回中文字符串
可以修改c文件的编码为utf-8