Unity Android调用动态库so

时间:2024-03-19 14:55:36
本文主要是在Android环境下,调用so库,下面就来看下调用动态库so的步骤。

一、生产so库

1.用的代码和Windows篇的产不多,不过稍作修改,不需要导出dll了,
NaviteCode.h

AخA
 
1
    #ifndef __NativeCode_H__
2
    #define __NativeCode_H__
3
    #if 0
4
    #define EXPORT_DLL __declspec(dllexport) //导出dll声明
5
    #else
6
    #define EXPORT_DLL 
7
    #endif
8
    extern "C" 
9
        EXPORT_DLL int MyAddFunc(int _a, int _b);
10
    
11
    #endif

NaviteCode.cpp

7
 
1
    #include "NaviteCode.h"
2
    extern "C" 
3
        int MyAddFunc(int _a, int _b)
4
        
5
            return _a + _b;
6
        
7
    

2.新建一个文件夹native,把 NaviteCode.h 和 NaviteCode.cpp 都丢进去,同时新建两个文件 Android.mk 和 Application.mk(ndk编译需要的文件)
Android.mk

8
 
1
LOCAL_PATH := $(call my-dir)
2
include $(CLEAR_VARS)
3
LOCAL_MODULE     :=  NativeCode
4
LOCAL_C_INCLUDES := $(LOCAL_PATH)
5
LOCAL_SRC_FILES  := NaviteCode.cpp
6
LOCAL_LDLIBS     := -llog -landroid
7
LOCAL_CFLAGS    := -DANDROID_NDK
8
include $(BUILD_SHARED_LIBRARY)
生成的so全名是 libNativeCode.so,但在c#中加载还是按 NativeCode 加载

Application.mk

6
 
1
APP_STL := gnustl_static
2
APP_CPPFLAGS := -frtti -std=c++11
3
APP_PLATFORM := android-19
4
APP_CFLAGS += -Wno-error=format-security
5
APP_BUILD_SCRIPT := Android.mk
6
APP_ABI := armeabi-v7a x86
指定生产的不同cpu架构的so库 armeabi-v7a 和 x86,(其实APP_CPPFLAGS 中没用到c++11的东西和运行时识别rtti,不过无妨)

3.cmd中cd到native目录下,运行命令编译

1
 
1
ndk-build NDK_PROJECT_PATH=. NDK_APPLICATION_MK=Application.mk
Unity Android调用动态库so

生产两个so

2
 
1
C:\Users\Wilker\Desktop\native\libs\armeabi-v7a\libNativeCode.so
2
C:\Users\Wilker\Desktop\native\libs\x86\libNativeCode.so

4.附,在Linux中查看一下这个so中的函数
把 libNativeCode.so 对到Linux中,输入命令 # nm -D libNativeCode.so
Unity Android调用动态库so

5.然后在c#脚本中调用下这个方法

9
 
1
public class testDll : MonoBehaviour 
2
    [DllImport("NativeCode")]
3
    public static extern int MyAddFunc(int x, int y);
4
    // Use this for initialization
5
    void Start () 
6
        int ret = MyAddFunc(200, 200);
7
        Debug.LogFormat("--- ret:{0}", ret);
8
    
9

二、拷贝 libs 目录到 Assets\Plugins\Android 目录下

动态库不同平台的存放规则,请看官网:https://docs.unity3d.com/Manual/PluginInspector.html

三、设置打包参数

1.File->Build Settings
Unity Android调用动态库so

2.然后点击 Player Settings,设置详细参数
Unity Android调用动态库so

其他的就没什么好设置的了,自己慢慢玩,这里只测试so用

四、生产apk

Unity Android调用动态库so

五、测试以下

安装到 夜神模拟器 上测试的,然后用 Android Studio 调试
Unity Android调用动态库so

从输出日志上看调用成功
完成

六、遇到的小坑

1.Found plugins with same names x86_64
出现原因可能是之前有导出过x84的dll,而且存放so也不是在Android(大意了没照官方规则)

2.Android Studio 连接不上 夜神模拟器 调试
解决办法:
  • 打开到夜神安装目录(如cd D:\Program Files\NOX\Nox\bin)
  • 执行命令:nox_adb.exe connect 127.0.0.1:62001,连接模拟器
www.nainaitea.com