【详解】AndroidJNI配置C语言打印Logcat信息

举报
皮牙子抓饭 发表于 2025/05/27 19:26:07 2025/05/27
【摘要】 Android JNI配置C语言打印Logcat信息在开发Android应用时,有时我们需要使用C/C++来实现一些性能敏感的功能。JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。本文将介绍如何在Android项目中通过JNI调用C语言函数,并在C语言中打印Logcat信息。环境准备Android Studio:确...

Android JNI配置C语言打印Logcat信息

在开发Android应用时,有时我们需要使用C/C++来实现一些性能敏感的功能。JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。本文将介绍如何在Android项目中通过JNI调用C语言函数,并在C语言中打印Logcat信息。

环境准备

  1. Android Studio:确保你已经安装了最新版本的Android Studio。
  2. NDK (Native Development Kit):在Android Studio中安装NDK。可以通过​​File -> Settings -> Appearance & Behavior -> System Settings -> Android SDK -> SDK Tools​​来安装NDK。
  3. CMakendk-build:选择一个构建工具。本文将以CMake为例。

创建一个新的Android项目

  1. 打开Android Studio,创建一个新的项目。
  2. 选择“Empty Activity”模板,点击“Next”。
  3. 填写项目名称、保存位置、语言选择Java,点击“Finish”。

配置CMake

  1. 在项目的app目录下创建一个名为cpp的文件夹,用于存放C/C++源文件。
  2. cpp文件夹中创建一个C文件,例如native-lib.c
  3. app目录下的build.gradle文件中添加CMake配置:
android {
    ...
    defaultConfig {
        ...
        externalNativeBuild {
            cmake {
                cppFlags "-frtti -fexceptions"
            }
        }
    }
    externalNativeBuild {
        cmake {
            path "src/main/cpp/CMakeLists.txt"
            version "3.10.2"
        }
    }
}
  1. app/src/main目录下创建cpp文件夹,并在其中创建CMakeLists.txt文件,内容如下:
cmake_minimum_required(VERSION 3.10.2)
add_library( # Sets the name of the library.
             native-lib

             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             src/main/cpp/native-lib.c )

find_library( # Sets the name of the path variable.
              log-lib

              # Specifies the name of the NDK library that
              # you want CMake to locate.
              log )

target_link_libraries( # Specifies the target library.
                       native-lib

                       # Links the target library to the log library
                       # included in the NDK.
                       ${log-lib} )

编写C代码

在​​native-lib.c​​文件中编写C代码,定义一个可以被Java调用的函数,并在该函数中打印Logcat信息:

#include <jni.h>
#include <string.h>
#include <android/log.h>

#define LOG_TAG "NativeLog"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)

JNIEXPORT void JNICALL
Java_com_example_myapplication_MainActivity_printLog(JNIEnv *env, jobject /* this */) {
    LOGD("Hello from C!");
}

修改Java代码

在Java代码中调用C函数。打开​​MainActivity.java​​文件,添加以下代码:

package com.example.myapplication;

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

    static {
        System.loadLibrary("native-lib");
    }

    public native void printLog();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 调用C函数
        printLog();
    }
}

运行项目

  1. 连接Android设备或启动模拟器。
  2. 点击Android Studio中的运行按钮。
  3. 打开Android Studio的Logcat窗口,查看日志输出。你应该能看到类似如下的输出:
D/NativeLog: Hello from C!

通过上述步骤,我们成功地在Android项目中配置了JNI,并在C语言中实现了打印Logcat信息的功能。这不仅有助于调试C/C++代码,还能提高应用程序的性能和稳定性。

在Android开发中,JNI(Java Native Interface)允许开发者编写用C或C++编写的本地方法来实现一些性能敏感的操作。有时候,你可能需要从C/C++代码中输出日志到Android的日志系统(Logcat)。下面是一个简单的示例,展示如何通过JNI配置C语言来打印Logcat信息。

1. 创建一个简单的Android项目

首先,创建一个新的Android项目。假设你的项目名为​​MyJNIApp​​。

2. 配置CMakeLists.txt

在你的项目中,确保你已经配置了​​CMakeLists.txt​​文件,以便能够编译C/C++代码。如果你还没有这个文件,可以在​​app/src/main/cpp​​目录下创建它,并添加以下内容:

cmake_minimum_required(VERSION 3.4.1)

add_library( # Sets the name of the library.
             native-lib

             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             src/main/cpp/native-lib.cpp )

find_library( # Sets the name of the path variable.
              log-lib

              # Specifies the name of the NDK library that
              # you want CMake to locate.
              log )

target_link_libraries( # Specifies the target library.
                       native-lib

                       # Links the target library to the log library
                       # included in the NDK.
                       ${log-lib} )

3. 编写C代码

在​​app/src/main/cpp​​目录下创建一个​​native-lib.c​​文件,并添加以下内容:

#include <jni.h>
#include <string.h>
#include <android/log.h>

#define LOG_TAG "MyJNIApp"
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)

JNIEXPORT void JNICALL
Java_com_example_myjniapp_MainActivity_printLog(JNIEnv *env, jobject /* this */) {
    LOGI("Hello from C!");
    LOGE("This is an error message from C!");
}

4. 修改MainActivity.java

在你的​​MainActivity.java​​中,加载本地库并调用本地方法:

package com.example.myjniapp;

import android.os.Bundle;
import android.util.Log;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    static {
        System.loadLibrary("native-lib");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        printLog();
    }

    public native void printLog();
}

5. 运行应用

运行你的应用。打开Logcat窗口,你应该会看到如下日志输出:

I/MyJNIApp: Hello from C!
E/MyJNIApp: This is an error message from C!

解释

  • ​__android_log_print​​ 是Android NDK提供的函数,用于从C/C++代码中输出日志。
  • ​ANDROID_LOG_INFO​​ 和 ​​ANDROID_LOG_ERROR​​ 分别表示日志的级别。
  • ​LOG_TAG​​ 是日志的标签,方便在Logcat中过滤和查找日志。

通过这种方式,你可以在C/C++代码中方便地输出日志信息,帮助调试和监控应用的运行状态。在Android开发中,使用JNI(Java Native Interface)可以让Java代码调用C或C++编写的函数。通过JNI,开发者可以利用C/C++的性能优势来处理一些计算密集型任务。同时,有时候也需要从C/C++代码中输出日志信息到Android的日志系统(Logcat),以便于调试和监控程序运行状态。

要实现C语言代码向Android Logcat输出日志,你需要使用Android NDK提供的​​android/log.h​​头文件。这个头文件提供了几个宏定义,可以让你轻松地从C/C++代码中发送日志消息到Logcat。

步骤1: 配置NDK环境

首先,确保你的项目已经正确配置了NDK。如果你还没有配置,可以在​​build.gradle​​文件中添加NDK支持:

android {
    ...
    defaultConfig {
        ...
        externalNativeBuild {
            cmake {
                cppFlags "-frtti -fexceptions"
                arguments "-DANDROID_STL=c++_shared"
            }
        }
    }
    externalNativeBuild {
        cmake {
            path "src/main/cpp/CMakeLists.txt"
        }
    }
}

步骤2: 创建C/C++源文件

在项目的​​cpp​​目录下创建一个C/C++源文件,例如​​native-lib.c​​或​​native-lib.cpp​​。这里以C语言为例:

#include <jni.h>
#include <string.h>
#include <android/log.h>

#define LOG_TAG "MyNativeLog" // 定义日志标签
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)

// 导出给Java调用的函数
JNIEXPORT void JNICALL Java_com_example_myapp_MainActivity_callNativeLog(JNIEnv *env, jobject obj) {
    LOGI("This is an info message from native code.");
    LOGE("This is an error message from native code.");
}

步骤3: 编写CMakeLists.txt

在​​cpp​​目录下创建或编辑​​CMakeLists.txt​​文件,指定如何构建你的C/C++代码:

cmake_minimum_required(VERSION 3.4.1)

# 添加源文件
add_library( # 设置库名
             native-lib

             # 设置库类型
             SHARED

             # 添加源文件
             src/main/cpp/native-lib.c )

# 包含Android NDK的头文件路径
include_directories(${ANDROID_NDK}/sources/cxx-stl/llvm-libc++/include)
include_directories(${ANDROID_NDK}/sources/android/native_app_glue)
include_directories(${ANDROID_NDK}/sysroot/usr/include)

# 寻找并链接log库
find_library( log-lib
              log )
target_link_libraries( native-lib
                       ${log-lib} )

步骤4: 在Java代码中调用

最后,在Java代码中调用你定义的本地方法。确保你的类名和方法签名与C/C++代码中的定义相匹配:

package com.example.myapp;

public class MainActivity extends AppCompatActivity {

    static {
        System.loadLibrary("native-lib");
    }

    public native void callNativeLog();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        callNativeLog(); // 调用本地方法
    }
}

运行应用

当你运行应用时,你应该能够在Logcat中看到来自C/C++代码的日志输出。确保在Logcat中选择正确的日志级别(例如Info或Error),并且输入你之前定义的日志标签​​MyNativeLog​​来过滤日志。

以上就是如何在Android中使用C语言通过JNI输出Logcat日志的基本步骤。希望这对你有所帮助!

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。