一、下载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版本的