一个使用第三方静态库(*.a)的jni实例以及 ndk 使用第三方静态库生成动态库的实例

本文详细介绍了如何在Android项目中通过JNI技术集成第三方静态库的具体步骤,包括源码级集成和服务调用的方式,适用于希望深入了解Android底层开发的技术人员。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目上需要用到第三方的静态库,搞了二天终于搞定,记录下足迹:

在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实例的文件结构如下



至此,本文结束







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值