编译NDK程序
这里先介绍下Application.mk不在应用程序目录下的jni里,而是在其它目录下的jni里,这里具体目录就是在$NDK_ROOT/jni/下。通过Application.mk中的APP_BUILD_SCRIPT可以指定任意的应用程序里的Android.mk的特性来实现的。当然Application.mk也可以和Android.mk一起放在应用程序$Program/jni目录下,这种情况的编译请参见我的另一篇文章。
1. 安装工具:NDK和Cygwin(Windows)
cygwin安装完成后,在C:\cygwin\home\administrator\.bash_profile文件中
export ANDROID_NDK_ROOT=/cygdrive/E/Android/NDK/android-ndk-r8
export NDK=/cygdrive/E/Android/NDK/android-ndk-r8
export ANDROID_SRC=/cygdrive/E/Android/Src ==》不是必要的
对应路径书写为NDK安装以及工程路径
2. 使用Eclipse创建Android Project,java程序中写入如下内容:
public native String getStringValue();
public native String unimplementedGetStringValue();
static {
System.loadLibrary("JNITest");
}
生成对应的class文件
3. 使用javah生成native函数的头文件:
命令路径:\Src\JNITest\bin\classes(对应工程的class路径)
命令格式:javah -jni com.hybin.JNITest.JNITestActivity
生成对应的*.h文件
4. 建立jni:
创建jni文件夹
新建Android.mk和*.c文件
5. Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := JNITest
LOCAL_SRC_FILES := JNITestActivity.c
include $(BUILD_SHARED_LIBRARY)
6. *.c
#include <string.h>
#include <jni.h>
/*
* Class: com_hybin_JNITest_JNITestActivity
* Method: getStringValue
* Signature: ()Ljava/lang/String;
*/
jstring JNICALL Java_com_hybin_JNITest_JNITestActivity_getStringValue
(JNIEnv *env, jobject obj){
return (*env)->NewStringUTF(env, "TESTTEST !");
}
7. 编译so文件
使用cygwin,cd到对应工程jni路径下,使用 $NDK/ndk-build编译生成so文件
注:
2> cd $NDK_ROOT, 在ndk安装目录下mkdir jni 目录。
3>cd $NDK_ROOT/build/core,将该目录下的default-application.mk 拷贝到2>中jni目录下,并且重新命名为Application.mk。
4> 修改Application.mk中变量内容,指定需要编译的project路径,并且指定project path下对应的build 的make file脚本。这里编译ndk自带的samples下的hello-jni工程。
# Project Path
APP_PROJECT_PATH := $(NDK_PROJECT_PATH)/samples/hello-jni
# We expect the build script to be located here
APP_BUILD_SCRIPT := $(APP_PROJECT_PATH)/jni/Android.mk
变量APP_PROJECT_PATH是可选的,不过这里最好是指定下,看起来清晰些.
变量APP_BUILD_SCRIPT是必须的
8. 在Eclipse工程中,refresh一下,然后调用*.c中的函数接口进行验证测试。