加密ArcGIS离线地图及其在Android上的实现(4)

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的编译命令:

image

这个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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/pxxyz.html