Android在JNI中输出输出LOG

http://hi.baidu.com/theonlyking/blog/item/58dcc61373a98ac8f7039ebc.html

现在Android发展的如火如荼,但是它的一些程序还是需要调用到C的代码,这期间的衔接(JAVA与C之间)就叫做JNI。

不熟悉JNI的可以先百度一下,另外,还需要NDK的一个开发环境,我用的是NDK5。

话不多说,开始:

创建一个Android工程,之后,在里面创建一个类,里面只需要包含一个native方法即可,例:

package com.****.testjnilog;

public class TJLog {
 public native void ShowJNILog();
}
Eclipse会自动对.java文件进行编译,

下面需要生成相对应的.h文件,(用javah命令)

由于用javah命令生成h文件需要知道相应的类文件,所以这里会有一些需要注意的。

在cygwin下:进入到工程目录,这时候的类文件,都是放在bin/com/****/testjnilog下的,

我们所做的就是:进入到bin目录,然后用如下命令:

javah -jni com.****.testjnilog.TJLog

这个执行完成以后,在bin目录里面就生成好相应的.h文件了。

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_****_testjnilog_TJLog */

#ifndef _Included_com_****_testjnilog_TJLog
#define _Included_com_****_testjnilog_TJLog
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_****_testjnilog_TJLog
 * Method:    ShowJNILog
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_****_testjnilog_TJLog_ShowJNILog
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

创建一个.c文件,包含相应的.h文件,并将其中的函数进行实现。

#include "com_****_testjnilog_TJLog.h"

#include <android/log.h> // 这个是输出LOG所用到的函数所在的路径

#define LOG_TAG    "JNILOG" // 这个是自定义的LOG的标识
#undef LOG // 取消默认的LOG

#define LOGD(...)  __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__) // 定义LOG类型
#define LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__) // 定义LOG类型
#define LOGW(...)  __android_log_print(ANDROID_LOG_WARN,LOG_TAG,__VA_ARGS__) // 定义LOG类型
#define LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__) // 定义LOG类型
#define LOGF(...)  __android_log_print(ANDROID_LOG_FATAL,LOG_TAG,__VA_ARGS__) // 定义LOG类型

JNIEXPORT void JNICALL Java_com_****_testjnilog_TJLog_ShowJNILog
  (JNIEnv *env, jobject obj) // 注意一定要写上两个变量,否则NDK编译的时候是编译不过去的。
{
 LOGD("Hello JNILog");
}
好了,代码都写完了,剩下的就是编译so库了。

按照NDK中的例子,在工程目录下创建一个jni的文件夹,将两个文件拷贝到目录里面,并将一个Android.mk拷贝进来,

修改方法如下:


LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := testjnilog
LOCAL_SRC_FILES := com_aemm_testjnilog_TJLog.c

LOCAL_LDLIBS := -llog # 如果不包含这一句的话,会提示:__android_log_print 未定义

include $(BUILD_SHARED_LIBRARY)

接上面:从bin目录,返回到工程目录。按照NDK开发环境配置的路径进行编译,我的是ANDK

$ANDK/ndk-build

如果成功以后,就会提示生成了.so文件。(如果不成功,可以给我留言。)

在Android工程中引用.so文件。

public class testjnilog extends Activity {
 static
 {
  System.loadLibrary("testjnilog") ; // 注意,只是库名称,没有前面的 lib 与后面的 .so 
 }
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        TJLog jlog = new TJLog();
        jlog.ShowJNILog(); 
    }
}

运行工程,就会在LOGCAT里面看到自己输出的LOG了。


你可能感兴趣的:(Android在JNI中输出输出LOG)