Android JNI打印c\c++日志信息
16lz
2021-01-23
一、下载android的源码注:此处源码的下载、配置、编译请自行搜寻。二、创建相关文件1、在/mnt/yqmiao/android_2.2_20100715/development/apps下创建工程目录JniLogmkdir JniLog注:有些文档的是在/mnt/yqmiao/android_2.2_20100715/development/下创建工程目录的,我之前执行[makexxxx]是成功的,但后来失败了!通过分析源码的核心配置文件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.cLOCAL_C_INCLUDES := \
$(JNI_H_INCLUDE)LOCAL_SHARED_LIBRARIES := \
libutilsLOCAL_PRELINK_MODULE := falseLOCAL_MODULE := libJniLoginclude $(BUILD_SHARED_LIBRARY)注:LOCAL_MODULE := libJniLoglibJniLog前面加lib是必须的,在加载的时候只需要JniLogeg: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 remountadb push out/target/product/generic/system/lib/libJniLog.so /system/lib6、java测试代码1)本地方法类package com.myq.android;public class Jni {
public native void printLog() ;
}注:包名必须是 com.myq.android.JniLog方法名 printLog2)测试类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( 380): 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版本的
... 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.cLOCAL_C_INCLUDES := \
$(JNI_H_INCLUDE)LOCAL_SHARED_LIBRARIES := \
libutilsLOCAL_PRELINK_MODULE := falseLOCAL_MODULE := libJniLoginclude $(BUILD_SHARED_LIBRARY)注:LOCAL_MODULE := libJniLoglibJniLog前面加lib是必须的,在加载的时候只需要JniLogeg: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 remountadb push out/target/product/generic/system/lib/libJniLog.so /system/lib6、java测试代码1)本地方法类package com.myq.android;public class Jni {
public native void printLog() ;
}注:包名必须是 com.myq.android.JniLog方法名 printLog2)测试类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( 380): 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版本的
更多相关文章
- android沉浸状态栏实现、地图多线路规划、Retrofit+RxJava+Jsoup
- android中编译资源文件的相关问题
- Android 神兵利器Dagger2使用详解(二)Module&Component源码分析
- 在Eclipse中导入android sdk源码
- 写TextView的Selector了解到的android读取xml文件的几点规则
- android私有目录直接读取
- Android基础知识之Manifest文件的组织结构