ue4html插件,UE4利用插件(Plugins)导入Dll和.so

在unity下使用dll非常的方便,然而在unreal下。。。不说了都是泪。

本文使用的引擎版本是ue4.21.2

进入正题,我们使用一个插件来管理第三方的Dll和.so。

首先在已经有的项目工程中新建一个插件,

05e857e5e48bcae460d10f5d9839fb2d.png

创建好插件后,在项目的目录下会找到Plugins/YOURplugin目录,其中内容如下图所示:(我的插件叫STmobile)

60ba8c740e8424d31ce1714bb0102b70.png

将要添加的Dll和.so复制进ThirdParty目录下,(当然你可以在ThirdParty下创建合适的文件路径):

d697b1745ed7955228a91f43117a0b00.png

然后打开YOURplugin.build.cs,添加如下代码:

private string ModulePath

{

get { return ModuleDirectory; }

}

private string ThirdPartyPath

{

get { return Path.GetFullPath(Path.Combine(ModulePath, "../../ThirdParty/")); }

}

public STmobile(ReadOnlyTargetRules Target) : base(Target)

{

PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;

if (Target.Platform == UnrealTargetPlatform.Win64)

{

PublicDelayLoadDLLs.Add(Path.Combine(ThirdPartyPath, "Win64", "st_mobile.dll"));

PublicDelayLoadDLLs.Add(Path.Combine(ThirdPartyPath, "Win64", "STAvatar.dll"));

RuntimeDependencies.Add(new RuntimeDependency(Path.Combine(ThirdPartyPath, "Win64", "st_mobile.dll")));

RuntimeDependencies.Add(new RuntimeDependency(Path.Combine(ThirdPartyPath, "Win64", "STAvatar.dll")));

}

。。。。。。。

}

注意路径不要搞错哦。.so同理,

public STmobile(ReadOnlyTargetRules Target) : base(Target)

{

PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;

if (Target.Platform == UnrealTargetPlatform.Android)

{

AdditionalPropertiesForReceipt.Add(new ReceiptProperty("AndroidPlugin", Path.Combine(ModuleDirectory, "STmobile_APL.xml")));

PublicAdditionalLibraries.Add(ThirdPartyPath + "Android/libs/armeabi-v7a/libxxxx.so");

PublicAdditionalLibraries.Add(ThirdPartyPath + "Android/libs/armeabi-v7a/libxxxx2.so");

}

}

这里会多添加一个xml文件,这个是干啥的呢?当我们打包android包时,会利用这个文件将.so复制到打包的目录下,如果没有这一步,打包出的apk运行时,会crash报找不到libxxx.so的错误,这个xml文件要放在YOURplugin.build.cs的同一目录下,下面是这个xml的主要内容:

Ok,前期准备工作完后,关闭工程,重新生成下.sln。

然后就是Dll函数的使用,在ue4工程中怎么使用Dll函数呢?在c++中我们有两种调用Dll函数的形式:

显式调用

隐式调用

这里我们使用显示调用,首先在YOURplugin.cpp的StartupModule函数中获得Dll的handle,如插件中的代码示例,照葫芦画瓢即可。

得到handle后,即可显式调用dll中的函数,示例如下:

static inline FSTmobileModule& Get()

{

return FModuleManager::LoadModuleChecked("STmobile");

}

static inline int exampleFunc(int a,intb)

{#if PLATFORM_WINDOWS

if(FSTmobileModule::Get().ST_mobileLibraryHandle)

{

typedefint(*_exampleFunc)(int a ,intb);

_exampleFunc ExampleFunc;

FString procName= "dllFuncName";

ExampleFunc= (_exampleFunc)FPlatformProcess::GetDllExport(FSTmobileModule::Get().ST_mobileLibraryHandle, *procName);if(ExampleFunc)

{returnExampleFunc(a,b);

}

}#elif PLATFORM_ANDROID

return dllFuncName(model_path, config, &handle);#endif}

调用.so中的函数,直接#include对应的头文件,然后调用同名函数即可。

如果想在project中调用插件中的函数,在project.build.cs中将YOURplugin包含进来,然后通过

FSTmobileModule::Get().exampleFunc(int a,int b)直接调用即可。记得#include "STmobile.h"哦

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值