项目上需要用到第三方的静态库,搞了二天终于搞定,记录下足迹:
在anroid源码中使用jni调用过程:
总览:
XXX@android-desktop:~/work/project/main$ svn st frameworks/base/
M frameworks/base/Android.mk
M frameworks/base/api/current.txt
? frameworks/base/core/java/android/hardware/IRfidUnpackService.aidl
? frameworks/base/core/java/android/hardware/RfidUnpackManager.java
M frameworks/base/core/java/com/odm/rfid/RfidDevice.java
? frameworks/base/services/java/com/android/server/RfidUnpackService.java
M frameworks/base/services/java/com/android/server/SystemServer.java
M frameworks/base/services/jni/Android.mk
M frameworks/base/services/jni/onload.cpp
? frameworks/base/services/jni/rfid
svn add后 :
XXX@android-desktop:~/work/project/main$ svn st frameworks/base/
M frameworks/base/Android.mk
M frameworks/base/api/current.txt
A frameworks/base/core/java/android/hardware/IRfidUnpackService.aidl
A frameworks/base/core/java/android/hardware/RfidUnpackManager.java
M frameworks/base/core/java/com/odm/rfid/RfidDevice.java
A frameworks/base/services/java/com/android/server/RfidUnpackService.java
M frameworks/base/services/java/com/android/server/SystemServer.java
M frameworks/base/services/jni/Android.mk
M frameworks/base/services/jni/onload.cpp
A frameworks/base/services/jni/rfid
A frameworks/base/services/jni/rfid/com_android_server_rfidunpack_service.cpp
A frameworks/base/services/jni/rfid/include_lib.h
A frameworks/base/services/jni/rfid/rfid_unpack.a
下面详述之:
jni 步骤
1、增加第三方库:新建目录 frameworks/base/services/jni/rfid 把第三方静态库 rfid_unpack.a和头文件include_lib.h放入该目录中
2、增加接口文件aidl: 在目录frameworks/base/core/java/android/hardware/下新增文件 IRfidUnpackService.aidl
内容:
package android.hardware;
/** @hide */
interface IRfidUnpackService
{
int unpackImage(in byte[] srcData, out byte[] dstData, int bmpSave);
}
3、实现服务:在目录frameworks/base/services/java/com/android/server/下新建文件服务器端程序 RfidUnpackService.java
内容:
package com.android.server;
import java.io.IOException;
import android.provider.Settings.SettingNotFoundException;
import android.provider.Settings;
import android.content.Context;
import android.util.Log;
import android.hardware.IRfidUnpackService;
/**
* Class that provides access to some of the power management functions.
*
*
*/
public final class RfidUnpackService extends IRfidUnpackService.Stub
{
private static final String TAG = "RfidUnpackService";
public RfidUnpackService()
{
}
private static native int nativeDeviceUnpack(byte[] srcData, byte[] dstData, int bmpSave);
public int unpackImage(byte[] srcData, byte[] dstData, int bmpSave)
{
return nativeDeviceUnpack(srcData, dstData, bmpSave);
}
}
4、生成签名文件: 编译 mm frameworks\base\services\java 生成文件 out/target/common/obj/JAVA_LIBRARIES/services_intermediates/classes/com/android/server/RfidUnpackService.class
然后使用javah生成 native使用的签名文件 javah -o rfidUpackJni.h-jni com.android.server.RfidUnpackService
rfidUpackJni.h 内容:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_android_server_RfidUnpackService */
#ifndef _Included_com_android_server_RfidUnpackService
#define _Included_com_android_server_RfidUnpackService
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_android_server_RfidUnpackService
* Method: nativeDeviceUnpack
* Signature: ([B[BI)V
*/
JNIEXPORT void JNICALL Java_com_android_server_RfidUnpackService_nativeDeviceUnpack
(JNIEnv *, jclass, jbyteArray, jbyteArray, jint);
#ifdef __cplusplus
}
#endif
#endif
5、实现native方法:在目录 frameworks/base/services/jni/rfid 下创建文件 com_android_server_rfidunpack_service.cpp 并根据上面的签名文件实现函数
nativeDeviceUnpack(byte[] srcData, byte[] dstData, int bmpSave)
内容:
#include "utils/Log.h"
#include "jni.h"
#include "JNIHelp.h"
#include "android_runtime/AndroidRuntime.h"
#include "include_lib.h"
//extern int unpack(char *src, char *dst, int bmpSave);
#define LOG_TAG "RfidDevice"
namespace android {
/*
* Class: com_odm_rfid_RfidDevice
* Method: nativeDeviceUnpack
* Signature: ([B[BI)I
*/
JNIEXPORT jint JNICALL Java_com_android_server_RfidUnpackService_nativeDeviceUnpack(JNIEnv *env, jclass clazz, jbyteArray srcArray, jbyteArray dstArray, jint bmpSave)
{
char* src = (char*)env->GetByteArrayElements(srcArray, 0);
char* dst = (char*)env->GetByteArrayElements(dstArray, 0);
ALOGE("---Java_com_odm_rfid_RfidDevice_nativeDeviceUnpack ---");
int ret = -1;
ret = unpack(src, dst, (int)bmpSave);
env->ReleaseByteArrayElements(srcArray, (jbyte*)src, JNI_FALSE);
env->ReleaseByteArrayElements(dstArray, (jbyte*)dst, JNI_FALSE);
return (jint)ret;
}
/*
* JNI registration.
*/
static JNINativeMethod gMethods[] = {
// name, signature, funcPtr
{ "nativeDeviceUnpack", "([B[BI)I", (void*) Java_com_android_server_RfidUnpackService_nativeDeviceUnpack },
};
int register_com_android_server_rfidunpack(JNIEnv* env)
{
jclass clazz = env->FindClass("com/android/server/RfidUnpackService");
if (clazz == NULL) {
ALOGE("Can't find com/android/server/RfidUnpackService");
return -1;
}
return jniRegisterNativeMethods(env, "com/android/server/RfidUnpackService", gMethods, NELEM(gMethods));
}
}; // namespace android
6、加载第三方静态库: 修改文件
Index: frameworks/base/services/jni/Android.mk
===================================================================
--- frameworks/base/services/jni/Android.mk (revision 359)
+++ frameworks/base/services/jni/Android.mk (revision 360)
@@ -19,6 +19,7 @@
com_android_server_irda.cpp \
com_android_server_printer.cpp \
com_android_server_miscdevice.cpp \
+ rfid/com_android_server_rfidunpack_service.cpp \
com_android_server_photoresistor.cpp \
../../../../$(MTK_PATH_SOURCE)/frameworks-ext/base/services/jni/com_android_server_PerfService.cpp \
onload.cpp
@@ -50,6 +51,9 @@
libsuspend \
libdl
+
+LOCAL_LDFLAGS += $(LOCAL_PATH)/rfid/rfid_unpack.a
+
ifeq ($(MTK_AAL_SUPPORT),yes)
LOCAL_C_INCLUDES += \
$(MTK_PATH_PLATFORM)/hardware/aal/inc
注: 重点是 这句
LOCAL_LDFLAGS += $(LOCAL_PATH)/rfid/rfid_unpack.a
这个就是加载了第三方的静态库,想当初俺可是费了九牛二虎之力才搞定。 什么LOCAL_STATIC_LIBRARIES := rfid_unpack.a
什么
include $(CLEAR_VARS)
LOCAL_MODULE := rfid
LOCAL_SRC_FILES := rfid_unpack.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/rfid/jni
##include $(BUILD_STATIC_LIBRARY)
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_STATIC_LIBRARIES := rfid.a
LOCAL_SRC_FILES:= \
com_android_server_rfidunpack_service.cpp
LOCAL_MODULE:= android_rfidjni
include $(BUILD_SHARED_LIBRARY)
都用过,都会报错,最讨厌的是 xxx/obj/SHARED_LIBRARIES/yyy_intermediates/import_includes需要的目标xxx/obj/STATIC_LIBRARIES/zzz_intermediates/export_includes 总之一把辛酸泪呀7、加载native服务: 把native方法加载到jni调用系统中
Index: frameworks/base/services/jni/onload.cpp
===================================================================
--- frameworks/base/services/jni/onload.cpp (revision 359)
+++ frameworks/base/services/jni/onload.cpp (revision 360)
@@ -43,6 +43,7 @@
int register_android_util_miscdevice(JNIEnv *env);
int register_android_util_photoresistor(JNIEnv *env);
+int register_com_android_server_rfidunpack(JNIEnv *env);
};
using namespace android;
@@ -80,6 +81,8 @@
register_android_util_printer(env);
register_android_util_miscdevice(env);
register_android_util_photoresistor(env);
+
+ register_com_android_server_rfidunpack(env);
return JNI_VERSION_1_4;
}
8、增加上层服务接口:在目录 frameworks/base/core/java/android/hardware/下增加文件 RfidUnpackManager.java
package android.hardware;
import android.content.Context;
import android.os.Binder;
import android.os.Bundle;
import android.os.Parcelable;
import android.os.ParcelFileDescriptor;
import android.os.Process;
import android.os.RemoteException;
import android.os.Handler;
import android.os.Message;
import android.os.ServiceManager;
import android.util.Log;
import android.hardware.IRfidUnpackService;
/**
*/
public class RfidUnpackManager
{
private static final String TAG = "RfidUnpackManager.";
private static IRfidUnpackService mRfidUnpackService;
public RfidUnpackManager() {
mRfidUnpackService = IRfidUnpackService.Stub.asInterface(ServiceManager.getService("rfidunpackservice"));
if (mRfidUnpackService != null) {
Log.i(TAG, "The RfidUnpackManager object is ready.");
}
else{
Log.i(TAG, "The RfidUnpackManager object is not ready.");
}
}
public static int unpackImage(byte[] srcData, byte[] dstData, int bmpSave) {
int ret = -1;
if (mRfidUnpackService == null) {
//Log.i(TAG, "RfidUnpack Service is not ready.");
mRfidUnpackService = IRfidUnpackService.Stub.asInterface(ServiceManager.getService("rfidunpackservice"));
if (mRfidUnpackService != null) {
Log.i(TAG, "The RfidUnpackManager object is ready.");
}
else{
Log.i(TAG, "The RfidUnpackManager object is not ready.");
return ret;
}
}
try {
Log.i(TAG,"RfidUnpackManager :unpackImage");
ret = mRfidUnpackService.unpackImage(srcData, dstData, bmpSave);
} catch (RemoteException e) {
Log.i(TAG,"Printer turnon manager exception");
}
return ret;
}
}
9、增加上层服务到系统中:
Index: frameworks/base/services/java/com/android/server/SystemServer.java
===================================================================
--- frameworks/base/services/java/com/android/server/SystemServer.java (revision 359)
+++ frameworks/base/services/java/com/android/server/SystemServer.java (revision 360)
@@ -112,6 +112,7 @@
import com.android.server.IrdaService;
import com.android.server.PrinterService;
import com.android.server.MiscDeviceService;
+import com.android.server.RfidUnpackService;
import com.android.server.PhotoresistorService;
class ServerThread extends Thread {
@@ -910,6 +911,13 @@
reportWtf("starting miscdevice Service", e);
}
+//for rfid unpackimage
+ try {
+ Slog.i(TAG, "rfidunpack Service");
+ ServiceManager.addService("rfidunpackservice", new RfidUnpackService());
+ } catch (Throwable e) {
+ reportWtf("starting rfidunpack Service", e);
+ }
//for Photoresistor 2014-05-05
try {
Slog.i(TAG, "Photoresistor Service");
注:增加该文件后需要使用 update-api编译一下,生成current.txt如下
Index: frameworks/base/api/current.txt
===================================================================
--- frameworks/base/api/current.txt (revision 359)
+++ frameworks/base/api/current.txt (revision 360)
@@ -10003,6 +10003,11 @@
method public void PrinterPowerOn();
}
+ public class RfidUnpackManager {
+ ctor public RfidUnpackManager();
+ method public static int unpackImage(byte[], byte[], int);
+ }
+
public final class Sensor {
method public float getMaximumRange();
method public int getMinDelay();
10、最后一步,调动服务:
Index: frameworks/base/core/java/com/odm/rfid/RfidDevice.java
===================================================================
--- frameworks/base/core/java/com/odm/rfid/RfidDevice.java (revision 359)
+++ frameworks/base/core/java/com/odm/rfid/RfidDevice.java (revision 360)
@@ -16,6 +16,7 @@
import android.content.Context;
import android.hardware.MiscDeviceManager;
+import android.hardware.RfidUnpackManager;
import android.hardware.SerialManager;
import android.hardware.SerialPort;
import android.os.FileObserver;
@@ -263,18 +264,39 @@
log("RfidDevice ---rfidDeviceDisable");
return deviceDisable() > 0;
}
public static int rfidDeviceUnpack(byte[] srcData, byte[] dstData, int bmpSave) {
+ //mRfidUnpackManager = new RfidUnpackManager();
+ return RfidUnpackManager.unpackImage(srcData, dstData, bmpSave);
}
+
+
}
至此 在android源码中增加第三方库文件的内容 完结
以下内容为在xp系统 cygwin环境下 以ndk方式增加第三方文件库的方法(即利用第三方静态库(*.a文件),生成一个动态库(*.so),然后app层直接使用 System.loadLibrary("xxx") )
前瞻说明:
将NDK编译的第三方静态拷贝到JNI目录下,在Android.mk中添加如下代码
以openssl静态库(libcrypto-static.a)为例
第一种链接方法:LOCAL_LDFLAGS := libcrypto-static.a
第二种链接方法:LOCAL_LDLIBS := libcrypto-static.a
第三种链接方法:
include $(CLEAR_VARS)
LOCAL_MODULE := third_static_lib (可以随便起一个名字)
LOCAL_SRC_FILES := libcrypto-static.a
include $(PREBUILT_STATIC_LIBRARY)
//在你要编译的模块中引用third_static_lib
LOCAL_STATIC_LIBRARIES := third_static_lib
NDK开放 在native方法中使用logcat:
第一步:在对应的mk文件中加入:LOCAL_LDLIBS := -llog
第二步:在要使用LOG的cpp文件中加入:
#include <android/log.h>
第三步:定义各个宏
#define LOG_TAG "nativeRfidUnpack"
#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, __VA_ARGS__)
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG , LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO , LOG_TAG, __VA_ARGS__)
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN , LOG_TAG, __VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR , LOG_TAG, __VA_ARGS__)
第四步:使用
LOGE("---Java_com_odm_rfid_RfidDevice_nativeDeviceUnpack ---");
步骤:
1、在eclipse工程中新建RfidUnPack.java文件,作为加载动态库和调用naive函数的地方
内容:
/**
* 文件名:RfidUnPack.java
* author: jimbo
* 版本信息 : copyright 2014
* 日期:2014-7-29
*
*/
package com.android.rfid;
import android.util.Log;
/**
* @author Administrator
*
*/
public class RfidUnPack {
private static String TAG = "RfidUnPack";
public RfidUnPack(){
}
public static int unpackImage(byte[] srcData, byte[] dstData, int bmpSave){
Log.d(TAG, "unpackImage: 111 before call nativeUnpackImage");
int ret = nativeUnpackImage(srcData, dstData, bmpSave);
Log.d(TAG, "unpackImage: 222 after call nativeUnpackImage");
return ret;
}
static {
Log.i(TAG, "RfidUnPack ---loadLibrary");
try {
System.loadLibrary("ndk-rfid");
} catch (UnsatisfiedLinkError ule) {
ule.printStackTrace();
Log.e(TAG, "WARNING: Could not load ndk-rfid.so");
}
}
native static int nativeUnpackImage(byte[] srcData, byte[] dstData, int bmpSave);
}
2、eclipse里面编译工程,然后会在bin/classes下生成类如 com/android/rfid/RfidUnPack.class的文件
3、启动cygwin工具,进入到bin/classes目录,使用javah生成native的签名、函数声明文件ndk.h
Administrator@RL-20140319EGIP /cygdrive/d/work/xxx/RfidxxxTest/jni
$ pwd
/cygdrive/d/work/xxx/Rfid<span style="font-family: Arial, Helvetica, sans-serif;">xxx</span>Test/jni
Administrator@RL-20140319EGIP /cygdrive/d/work/xxx/RfidxxxTest/jni
$ cd ../bin/classes
Administrator@RL-20140319EGIP /cygdrive/d/work/xxx/RfidxxxTest/bin/classes
<span style="color:#ff0000;">$ javah -o ndk.h com.android.rfid.RfidUnPack</span>
ndk.h内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_android_rfid_RfidUnPack */
#ifndef _Included_com_android_rfid_RfidUnPack
#define _Included_com_android_rfid_RfidUnPack
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_android_rfid_RfidUnPack
* Method: nativeUnpackImage
* Signature: ([B[BI)I
*/
JNIEXPORT jint JNICALL Java_com_android_rfid_RfidUnPack_nativeUnpackImage
(JNIEnv *, jclass, jbyteArray, jbyteArray, jint);
#ifdef __cplusplus
}
#endif
#endif
其中 ([B[BI)I为函数的签名,可以用在源码jni调用中 gMethod声明中的第二个参数 const char* signature;
typedef struct {
const char* name;
const char* signature;
void* fnPtr;
} JNINativeMethod;
4、在eclipse工程跟目录下新建文件夹jni
5、把第三方静态库(rfid_unpack.a)和头文件(include_lib.h)拷贝到jni目录下,并新建native 的ndk_unpackimge.cpp文件和 Android.mk文件
ndk_unpackimge.cpp内容:
#include "jni.h"
//#include "JNIHelp.h"
//#include "android_runtime/AndroidRuntime.h"
#include "include_lib.h"
//extern int unpack(char *src, char *dst, int bmpSave);
#define TAG "nativeRfidUnpack"
//#include <utils/Log.h>
#include <android/log.h>
#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, TAG, __VA_ARGS__)
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG , TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO , TAG, __VA_ARGS__)
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN , TAG, __VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR , TAG, __VA_ARGS__)
namespace android {
<span style="color:#ff0000;">#ifdef __cplusplus
extern "C" {
#endif</span>
/*
* Class: com_android_rfid_RfidUnPack
* Method: nativeUnpackImage
* Signature: ([B[BI)I
*/
//Java_com_android_rfid_RfidUnPack_nativeUnpackImage(JNIEnv *, jclass, jbyteArray, jbyteArray, jint);
JNIEXPORT jint JNICALL Java_com_android_rfid_RfidUnPack_nativeUnpackImage(JNIEnv *env, jclass clazz, jbyteArray srcArray, jbyteArray dstArray, jint bmpSave){
int ret = -1;
char* src = (char*)(env->GetByteArrayElements(srcArray, 0));
char* dst = (char*)(env->GetByteArrayElements(dstArray, 0));
LOGE("---Java_com_odm_rfid_RfidDevice_nativeDeviceUnpack ---");
ret = unpack(src, dst, (int)bmpSave);
env->ReleaseByteArrayElements(srcArray, (jbyte*)src, JNI_FALSE);
env->ReleaseByteArrayElements(dstArray, (jbyte*)dst, JNI_FALSE);
return (jint)ret;
}
<span style="color:#ff0000;">#ifdef __cplusplus
}
#endif</span>
}//namespace android
注意上面的红色字体标注内容,不加这几行的话会报错:No implementation found for native Lcom/android/rfid/RfidUnPack;.nativeUnpackImage:([B[BI)I java层调用native方法始终不成功,俺可是郁闷了n长时间最后通过度娘后才晓得的(参考:http://blog.youkuaiyun.com/keensword007/article/details/5720636)
另注:上面的文件在native调用时,在logcat中会出现
01-01 00:01:53.961: D/dalvikvm(2499): Trying to load lib /data/app-lib/com.android.rfiddemo.test-1/libndk-rfid.so 0x41f09060
01-01 00:01:53.963: D/dalvikvm(2499): Added shared lib /data/app-lib/com.android.rfiddemo.test-1/libndk-rfid.so 0x41f09060
01-01 00:01:53.964: D/dalvikvm(2499): No JNI_OnLoad found in /data/app-lib/com.android.rfiddemo.test-1/libndk-rfid.so 0x41f09060, skipping init
不过这个没有关系,函数可以成功调用,如果不想这行内容出现的话,就要实现函数 JNI_OnLoad函数了(可以参考:http://blog.youkuaiyun.com/luhuajcdd/article/details/7750146)
Android.mk 文件内容:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
<span style="color:#ff0000;">LOCAL_LDFLAGS := rfid_unpack.a
# LOCAL_LDLIBS := rfid_unpack.a 加载第三方静态库的两种方法,都可行</span>
LOCAL_LDLIBS := -llog <span style="white-space:pre"> </span># <span style="color:#ff0000;">可以使用logcat 打印日志的库</span>
LOCAL_SHARED_LIBRARIES := \
libutils
LOCAL_MODULE := ndk-rfid
LOCAL_SRC_FILES := ndk_unpackimge.cpp
include $(BUILD_SHARED_LIBRARY)
6、使用cygwin编译生成动态库 libndk-rfid.so
Administrator@RL-20140319EGIP /cygdrive/d/work/xxx/RfidxxxTest/bin/classes
$ pwd
/cygdrive/d/work/xxx/RfidxxxTest/bin/classes
Administrator@RL-20140319EGIP /cygdrive/d/work/xxx/RfidxxxTest/bin/classes
$ cd ../../jni
Administrator@RL-20140319EGIP /cygdrive/d/work/<span style="font-family: Arial, Helvetica, sans-serif;">xxx</span>/RfidxxxTest/jni
$ ndk-build
Android NDK: WARNING: APP_PLATFORM android-19 is larger than android:minSdkVersion 8 in /cygdrive/d/work/<span style="font-family: Arial, Helvetica, sans-serif;">xxx</span>/RfidxxxTest/AndroidManifest.xml
Android NDK: WARNING:/cygdrive/d/work/xxx/RfidxxxTest/jni/Android.mk:ndk-rfid: non-system libraries in linker flags: rfid_unpack.a
Android NDK: This is likely to result in incorrect builds. Try using LOCAL_STATIC_LIBRARIES
Android NDK: or LOCAL_SHARED_LIBRARIES instead to list the library dependencies of the
Android NDK: current module
[armeabi] Compile++ thumb: ndk-rfid <= ndk_unpackimge.cpp
[armeabi] SharedLibrary : libndk-rfid.so
[armeabi] Install : libndk-rfid.so => libs/armeabi/libndk-rfid.so
7、最后clean eclipse工程,重新编译工程,就可以进行测试了
测试结果部分logcat
01-01 00:01:53.960: I/RfidUnPack(2499): <span style="color:#ff0000;">RfidUnPack ---loadLibrary</span>
01-01 00:01:53.961: D/dalvikvm(2499): Trying to load lib /data/app-lib/com.android.rfiddemo.test-1/libndk-rfid.so 0x41f09060
01-01 00:01:53.963: D/dalvikvm(2499): Added shared lib /data/app-lib/com.android.rfiddemo.test-1/libndk-rfid.so 0x41f09060
01-01 00:01:53.964: D/dalvikvm(2499): No JNI_OnLoad found in /data/app-lib/com.android.rfiddemo.test-1/libndk-rfid.so 0x41f09060, skipping init
01-01 00:01:53.964: D/RfidUnPack(2499): unpackImage: 111 before call nativeUnpackImage
01-01 00:01:53.965: E/nativeRfidUnpack(2499): <span style="color:#ff0000;">---Java_com_odm_rfid_RfidDevice_nativeDeviceUnpack ---</span>
01-01 00:01:54.057: D/RfidUnPack(2499): unpackImage: 222 after call nativeUnpackImage
eclips工程ndk实例的文件结构如下