目录
一、引入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打印