一、下载android的源码
注:
此处源码的下载、配置、编译请自行搜寻。
二、创建相关文件
1、
在/mnt/yqmiao/android_2.2_20100715/development/apps下创建工程目录JniLog
mkdir JniLog
注:
有些文档的是在/mnt/yqmiao/android_2.2_20100715/development/下创建工程目录的,我之前执行[make xxxx]是成功的,但后来失败了!通过分析源码的核心配置文件Android.xml后放在apps下却是成功的!
注:
摘录Android.xml文件
subdirs += \
...
development/apps \
...
通过以上的Android.xml文件可以看出,如果我们修改Android.xml文件也是可以实现的!
eg:
subdirs +=\
...
development\
...
2、在JniLog下创建JniLog.c文件
#include<jni.h>
#define LOG_TAG "------JniLog Main--------"
#undef LOG
#include<utils/Log.h>
JNIEXPORT void JNICALL Java_com_myq_android_Jni_printLog(JNIEnv * env, jobject jobj)
{
LOGD("Android Jni Log test !\n");
}
注:
LOGD及#define LOG_TAG "xxx"打印log的方式采用了Android所提供的LOG机制,这样才能通过Android的logcat工具看到log信息。
3、在JniLog下创建Android.mk文件
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \
JniLog.c
LOCAL_C_INCLUDES := \
$(JNI_H_INCLUDE)
LOCAL_SHARED_LIBRARIES := \
libutils
LOCAL_PRELINK_MODULE := false
LOCAL_MODULE := libJniLog
include $(BUILD_SHARED_LIBRARY)
注:
LOCAL_MODULE := libJniLog
libJniLog前面加lib是必须的,在加载的时候只需要JniLog
eg:
static
{
System.loadLibrary("JniLog") ;
}
4、到android源代码的根目录下执行
make libJniLog
输出如下信息:
target thumb C: libJniLog <= development/apps/JniLog/JniLog.c
target SharedLib: libJniLog (out/target/product/generic/obj/SHARED_LIBRARIES/libJniLog_intermediates/LINKED/libJniLog.so)
target Non-prelinked: libJniLog (out/target/product/generic/symbols/system/lib/libJniLog.so)
target Strip: libJniLog (out/target/product/generic/obj/lib/libJniLog.so)
Install: out/target/product/generic/system/lib/libJniLog.so
可以看出:
成功make后生成out/target/product/generic/system/lib/libJniLog.so文件
那么libJniLog.so如何使用呢?
5、libJniLog.so文件使用
1)方法一
在Android工程根目录下创建目录libs/armeabi,然后将此文件拷入
2)方法二
启动Emulator后
adb remount
adb push out/target/product/generic/system/lib/libJniLog.so /system/lib
6、java测试代码
1)本地方法类
package com.myq.android;
public class Jni {
public native void printLog() ;
}
注:
包名必须是 com.myq.android.JniLog
方法名 printLog
2)测试类
package com.myq.android.jni;
import android.app.Activity;
import android.os.Bundle;
import com.myq.android.Jni;
public class Main extends Activity {
private Jni mJniLog ;
static
{
System.loadLibrary("JniLog") ;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
this.mJniLog = new Jni() ;
this.mJniLog.printLog() ;
}
}
三、运行
adb logcat
如下结果:
D/dalvikvm( 3
80): No JNI_OnLoad found in /data/data/com.myq.android.jni/lib/libJniLog.so 0x43e16a28, skipping init
D/------JniLog Main--------( 380): Android Jni Log test !
I/ActivityManager( 61): Displayed activity com.myq.android.jni/.Main: 1288 ms (total 1288 ms)
说明:
我是将libJniLog.so拷贝到工程目录/libs/armeabi下使用的
四、重点强调
1、目前我是必须放在android的源码下make的,如果单纯的放在NDK里,会报错!
究其原因是有关于Log方面的!
2、有关于libJniLog.so文件
Android.mk文件中
LOCAL_MODULE := libJniLog
在程序中加载时,如下使用方法:
static
{
System.loadLibrary("JniLog") ; //前面没有lib啊
}
3、有关libJniLog.so文件的使用方法
1)
放在设备的 /system/lib 下
2)
放在 工程目录/libs/armeabi 下
五、附件说明
附件中是我的:
1、Jni源码 --可以解压后放到$Android_Src_Root/development/apps下
2、Client测试源码 --用Eclipse直接运行,我用的是Android2.2版本的