【安卓平台so打印log】Unity 调用so文件并打印Log(C语言中打印log到android控制台)

目录

一、引入log库

二、C代码中引入头文件

三、打印日志的代码(跟C语言中printf的使用方式一样)

四、给jni日志添加开关

五、unity调用,安卓打印完整Demo

1.新建安卓工程,在src文件下面创建以下文件

2.编译so

3.unity调用

4.测试调用


 

一、引入log库

  • 1.如果是使用android.mk的方式手动生成so库,在android.mk的配置文件中加入配置:

      LOCAL_LDLIBS += -llog
    

  • 2.如果是使用构建脚本的方式生成so库,需要在build.gradle文件的ndk闭包中配置:

      defaultConfig {
          applicationId "com.huyingzi.xxxx"
          minSdkVersion 15
          targetSdkVersion 22
          versionCode 1
          versionName "1.0"
    
          testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    
          ndk{
              moduleName "helloword"
              abiFilters "armeabi","armeabi-v7a","x86"
    
              ldLibs "log"  //引入log库
          }
      }
    

3.如果是使用Cmake的方式构建so库,在CMakeLists.txt文件里面已经默认引入log库不需要再自行配制

二、C代码中引入头文件

 

#include <android/log.h>
#define LOG_TAG "System.out"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)

三、打印日志的代码(跟C语言中printf的使用方式一样)

 

    //打印logcat
    LOGD("name=%s age=%f\n",name,age);

四、给jni日志添加开关

 

#include <android/log.h>
#define DEBUG 0 //日志开关,1为开,其它为关
#if(DEBUG==1)
#define LOG_TAG "JNI"
#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE,TAG,__VA_ARGS__)
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
#else
#define LOGV(...) NULL
#define LOGD(...) NULL
#define LOGI(...) NULL
#define LOGE(...) NULL
#endif

 编译文件参照

五、unity调用,安卓打印完整Demo

1.新建安卓工程,在src文件下面创建以下文件

c文件

#include <stdio.h>

#include <android/log.h>
#define DEBUG 1 //日志开关,1为开,其它为关
#if(DEBUG==1)
#define LOG_TAG "XHSJ_JNI"
#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE,TAG,__VA_ARGS__)
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
#else
#define LOGV(...) NULL
#define LOGD(...) NULL
#define LOGI(...) NULL
#define LOGE(...) NULL
#endif

float add(float x, float y)
{
    LOGD("add:%f + %f \n",x,y);
	return x + y;
}
int GetArr(int arr[],int len) {
    int sum = 0;
    for (int j = 0; j < len; j++)
    {
        sum += arr[j];
        LOGE("Element[%d] = %d\n", j, arr[j]);
    }
    return sum;
}

int ImgProc(char* pData, int iWidth, int iHeight) {
    LOGD("ImgProc pData 的地址:%p\n",pData);
    return 8888;
}

Android.mk

include $(CLEAR_VARS)

# override strip command to strip all symbols from output library; no need to ship with those..
# cmd-strip = $(TOOLCHAIN_PREFIX)strip $1 

#$LOCAL_ARM_MODE  := arm
LOCAL_PATH      := $(NDK_PROJECT_PATH)
LOCAL_MODULE    := libnative
#LOCAL_CFLAGS    := -Werror
LOCAL_SRC_FILES := NativeCode.c
LOCAL_LDLIBS    += -llog

include $(BUILD_SHARED_LIBRARY)

Application.mk

APP_OPTIM        := release
APP_ABI          := armeabi-v7a x86
APP_PLATFORM     := android-8
APP_BUILD_SCRIPT := Android.mk

build_plugin.sh

#!/bin/sh
echo ""
echo "Compiling NativeCode.c..."
$ANDROID_NDK_ROOT/ndk-build NDK_PROJECT_PATH=. NDK_APPLICATION_MK=Application.mk $*
mv libs/armeabi/libnative.so ..

echo ""
echo "Cleaning up / removing build folders..."  #optional..
rm -rf libs
rm -rf obj

echo ""
echo "Done!"

2.编译so

cd到 Android Studio src目录下,输入以下命令回车,

ndk-build NDK_PROJECT_PATH=. NDK_APPLICATION_MK=Application.mk

编译成功效果

3.unity调用

复制生成的lib文件,放在unity工程Plugins/Android下

C#调用so文件

public class CallNativeCode : MonoBehaviour
{

    [DllImport("native")]
    private static extern float add(float x, float y);

    [DllImport("native")]
    private static extern int GetArr(int[] arr, int len);

    [DllImport("native")]
    public static extern int ImgProc(IntPtr inputData, int width, int height);

    public Text tipText;

    public void Method1_AddClick()
    {
        tipText.text = "8 + 10 = " + add(8, 10).ToString();
    }
    public void Method2_GetArr()
    {
        int[] arr = new int[] { 4, 4, 7, 9 };
        int res = GetArr(arr, arr.Length);
        tipText.text = "GetArr:" + res;
    }

    public void Method3_ImgProc()
    {
        IntPtr p = new IntPtr();
        tipText.text = ImgProc(p, 3, 4).ToString();
    }
}

4.测试调用

打包apk,查看logcat打印

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jack Yan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值