D:/wuyf/Workspace/Android/AgsEncryptTiles/bin>javah -jni com.esri.wuyf.JNI
执行成功后生成一个com_esri_wuyf_JNI.h文件,现在在Android工程的根目录下新建一个“jni”文件夹,并将生成的这个C头文件拷贝到该目录中:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* Header for class com_esri_wuyf_JNI */
#ifndef _Included_com_esri_wuyf_JNI
#define _Included_com_esri_wuyf_JNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_esri_wuyf_JNI
* Method: getEncryptTile
* Signature: (Ljava/lang/String;III)[B
*/
JNIEXPORT jbyteArray JNICALL Java_com_esri_wuyf_JNI_getEncryptTile
(JNIEnv *, jobject, jstring, jstring, jstring, jint, jint, jint);
#ifdef __cplusplus
}
#endif
#endif
实现JNI的具体方法在Android工程的“jni”目录下新建一个com_esri_wuyf_JNI.c文件,并实现头文件中的函数:
#include "com_esri_wuyf_JNI.h"
#include "md5.h"
JNIEXPORT jbyteArray JNICALL Java_com_esri_wuyf_JNI_getEncryptTile(JNIEnv* env,
jobject obj, jstring strDeviceId, jstring strLocation,
jstring strBundleBase, jint level, jint row, jint col) {
……
return result;
}
新建Android的makefile文件在“jni”目录下新建一个文件Android.mk文件,它是Android的makefile:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= com_esri_wuyf_JNI.c md5.c
LOCAL_C_INCLUDES := $(JNI_H_INCLUDE)
LOCAL_LDLIBS := -llog
LOCAL_PRELINK_MODULE := false
LOCAL_MODULE := JNI
include $(BUILD_SHARED_LIBRARY)
编译JNI链接库从开始菜单进入Cygwin Bash Shell,首先在当前用户的.bash_profile中添加一个$NDK环境变量(指向Android NDK的解压目录),让我们可以更加方便地编译Android JNI代码:
$ vi ~/.bash_profile
export NDK=/cygdrive/d/Software/Develop/Android/android-ndk-windows
下面,在Cygwin Bash Shell中进入Android工程目录(/cygdrive/d表示Windows中的D盘),并执行NDK的编译命令:
这个libJNI.so会生成在Android工程的libs/armeabi目录下,注意,调试时这个链接库不会自动更新到Android设备上,因此一旦重新编译这个链接库,需要手动push到设备的相应目录(这里是/data/data/com.esri.wuyf/lib)下:
在Java代码中调用JNI函数在使用JNI函数的Java类中静态加载JNI库,然后新建JNI对象并调用其相应的方法:
static {
System.loadLibrary("JNI");
}
JNI jni = new JNI();
result = jni.getEncryptTile(deviceId, location, bundleBase, level, row, col);
将离线数据push到设备中开发中还需要将离线数据批量push到设备中,这需要用Android的adb工具:
D:/Software/Develop/Android/android-sdk-windows/platform-tools>adb push D:/Temp /sdcard
这表示要将D:/Temp下所有内容push到设备的SD卡中。注意,这个Temp目录并不会出现在SD卡中。
另外,如果需要从SD卡批量删除文件必须进入shell执行Linux的rm命令:
>adb remount
>adb shell
# rm -R /sdcard/xxx