Android初涉NDK,从零打造你的第一个demo
最近打算重构项目中的部分代码,将部分耗时或者敏感的代码放到native中实现。说来惭愧,本人今年3月份才开始接触android开发,虽然一早就知道android中可以使用c/c++代码,但一直没有尝试。于是趁着这次机会研究一下android中的ndk开发,花了一个下午加一个上午,经历了种种悲剧后终于跑通了第一个demo。在整个过程中参考了无数文章,也走了很多弯路,特此写下本文章,希望帮助刚刚接触JNI的童鞋们更快的上手。
上面说的貌似是废话,现在开始进入正题。我的开发环境是windows+eclipse,因此在开始真正写代码前,还需要在windows上搭建相关环境才能编译.so文件。这里我推荐看下 http://www.cnblogs.com/jdksummer/articles/2166057.html 这篇配置文章写的很详细。
假设你现在已经搭建好了开发环境,那么开始吧!(听着音乐,开始我们的学习吧!!)
1.打开eclipse新建一个android的工程,就叫"MyFirstJNI"吧。建立后添加一个class文件作为jni的接口,我是这样添加的
在该类中添加如下代码:都是一些很简单的函数^^
package com.example.myjni;public class JNI { public native void write(); public native String sayHello(); public native int plus(int a, int b);}
#include <string.h>#include "com_example_myjni_JNI.h"JNIEXPORT void JNICALL Java_com_example_myjni_JNI_write (JNIEnv *env, jobject thiz) { }/* * Class: com_example_myjni_JNI * Method: sayHello * Signature: ()Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_com_example_myjni_JNI_sayHello (JNIEnv *env, jobject thiz){ return (*env)->NewStringUTF(env, "Hello from JNI !");}/* * Class: com_example_myjni_JNI * Method: plus * Signature: (II)I */JNIEXPORT jint JNICALL Java_com_example_myjni_JNI_plus (JNIEnv *env, jobject thiz, jint a, jint b) { return a+b; }
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := first_jni (最终so文件名是libfirst_jni.so)LOCAL_SRC_FILES := com_example_myjni_JNI.c include $(BUILD_SHARED_LIBRARY)
static { System.loadLibrary("first_jni");}