在Unreal开发中,通过plugin导入第三方库

server/2025/3/3 23:12:34/

在项目开发中,不可避免的会使用到第三方库。这里以自己用到的sojaraar格式的第三方库为例子,说明如何导入并使用。

前提:假设你的项目中已经增加了一个plugin,现在是要在这个plugin中使用第三方库,另外我们的项目假设在Android环境下运行。

导入so库并调用其中方法

  1. 在plugin的目录下创建include、libs目录,将第三方库的头文件和so文件放入相应位置
  2. 在模块的Build.cs文件中指定头文件和库文件的位置
    if (Target.Platform == UnrealTargetPlatform.Android){PrivateDependencyModuleNames.Add("Launch");AdditionalPropertiesForReceipt.Add("AndroidPlugin", Path.Combine(ModuleDirectory, "fngameAndroidPlugin_UPL.xml"));// 指定头文件和库文件的路径PublicIncludePaths.Add(Path.Combine(ModuleDirectory, "include/"));PublicAdditionalLibraries.Add(Path.GetFullPath(Path.Combine(ModuleDirectory, "libs/")) + "libtest.so");}
  3. 在UPL的xml文件中,拷贝库文件到打包输出的目录下
    <!--复制文件$S(PluginDir)=插件的build.cs所在目录. $S(BuildDir)打包输出的AndroidManifest.xml所在目录-->
    <resourceCopies><copyFile src="$S(PluginDir)/lib/libtest.so" dst="$S(BuildDir)/jni/arm64-v8a/libtest.so"/></resourceCopies>

    这个地方自己注意一下,在打包成Android后,检查一下Intermediate\Android\arm64\gradle\app\src\main\jniLibs\arm64-v8a目录下有没有相应的库,和设定的加载目录对比一下。实在不行的话,就在打包出来后,手动把so文件拷贝过去。

导入jar或者aar并调用其中方法

  1. 在UPL的xml文件中,拷贝库文件到打包输出的目录下
    <!--复制文件$S(PluginDir)=插件的build.cs所在目录. $S(BuildDir)打包输出的AndroidManifest.xml所在目录-->
    <resourceCopies><copyFile src="$S(PluginDir)/lib/gamelib.jar" dst="$S(BuildDir)/libs/gamelib.jar"/><copyFile src="$S(PluginDir)/lib/test.aar" dst="$S(BuildDir)/libs/test.aar"/></resourceCopies>

    这里注意,如果是aar文件,需要额外添加一下内容,才能让打包出的Android项目正确导入aar

    <buildGradleAdditions><insert>android {repositories{flatDir{dirs'src/main/libs'}}}dependencies {implementation name:'test',ext:'aar'}</insert></buildGradleAdditions>

  2. 在UPL的xml文件中,引入用到的第三方库。这里用到了哪些就import哪些,如果有遗漏,在后面build的时候也会提示
    <gameActivityImportAdditions><insert>import com.example.test;</insert></gameActivityImportAdditions>
  3. 在UPL的xml文件中,添加对第三方库函数的调用。根据具体的调用方式,采用静态调用或者对象调用。这里相当于给JNI调用生成Java实例,在c++中我们调用的就是这里声明的init方法
    <gameActivityClassAdditions><insert>private static Example mInstance;private Context mContext;public int init() {mInstance= Example.getInstance();return mInstance.init(mContext);}</insert>
    </gameActivityClassAdditions>
  4. 接下来,我们就可以在c++端进行调用了。假设我们定义了一个TestJNI类,其中有个Init()方法,在方法中首先通过FAndroidApplication::GetJavaEnv()获取JNIEnv,使用FJavaWrapper::FindMethod()找到对应的init函数,然后调用FJavaWrapper::CallIntMethod()方法执行函数,获取它的返回值。关于这里更多的语法请看另外一篇文章

    int32 TestJNI::Init()
    {UE_LOG(LogTemp, Warning, TEXT("TestJNI Init"));int32 initResult = -1;if (JNIEnv* Env = FAndroidApplication::GetJavaEnv()) {jmethodID InitID = FJavaWrapper::FindMethod(Env, FJavaWrapper::GameActivityClassID, "init",  "()I", false);if (InitID != nullptr){UE_LOG(LogTemp, Warning, TEXT("Success to find method init"));initResult = FJavaWrapper::CallIntMethod(Env, FJavaWrapper::GameActivityThis, InitID);}}else {UE_LOG(LogTemp, Error, TEXT("Failed to get env"));}UE_LOG(LogTemp, Warning, TEXT("TestJNI Init result: %d"), initResult);return initResult;
    }

结语

到此,通过plugin导入第三方库并调用函数就说明完成了。从UE打包出的Android工程中,我们可以看到Intermediate\Android\arm64\gradle\app\src\main\java\com\epicgames\unreal\GameActivity.java中,已经有了我们在xml文件中加入的import、init()函数,在libs目录下也有对应的库文件。如果需要,可以用Android Studio打开工程进行进一步的修改。


http://www.ppmy.cn/server/172181.html

相关文章

【实战 ES】实战 Elasticsearch:快速上手与深度实践-1.2.1索引、文档、分片、副本

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 1.2 核心概念精讲-1.2.1索引&#xff08;Index&#xff09;、文档&#xff08;Document&#xff09;、分片&#xff08;Shard&#xff09;、副本&#xff08;Replica&#x…

mongodb副本集1主2从节点的配置方法示例

配置 MongoDB 副本集&#xff08;1 主节点 2 从节点&#xff09;的步骤如下&#xff1a; 环境准备 3 台服务器&#xff0c;分别运行 MongoDB 实例。确保服务器之间网络互通。安装 MongoDB&#xff08;版本需一致&#xff09;。 配置步骤 1. 修改 MongoDB 配置文件 在每个…

《白帽子讲 Web 安全》之移动 Web 安全

目录 摘要 一、WebView 简介 二、WebView 对外暴露 WebView 对外暴露的接口风险 三、通用型 XSS - Universal XSS 介绍 四、WebView 跨域访问 五、与本地代码交互 js 5.1接口暴露风险&#xff1a; 5.2漏洞利用&#xff1a; 5.3JavaScript 与 Native 代码通信 六、Chr…

1688代采系统:自动化采购的高效解决方案

在跨境电商迅猛发展的今天&#xff0c;海外买家和跨境电商卖家面临着商品采购的诸多挑战&#xff0c;如语言障碍、支付不便、物流复杂等问题。为应对这些挑战&#xff0c;1688代采系统应运而生&#xff0c;它对接了1688官方API&#xff0c;实现了自动采集商品数据、自动代采下单…

在android studio上使用rknn模块下面的yolov8_pose模型

我的第一想法就是直接把rk的demo当成so库封装来用,我直接在yolov8_pose的c代码下面添加yolov8_pose.cc与yolov8_pose.h用作封装,先上代码 yolov8_pose.cc #include "yolov8_pose.h"#include <stdint.h> #include <stdio.h> #include <stdlib.h> #…

Linux | Ubuntu 与 Windows 双系统安装 / 高频故障 / UEFI 安全引导禁用

注&#xff1a;本文为 “buntu 与 Windows 双系统及高频故障解决” 相关文章合辑。 英文引文&#xff0c;机翻未校。 How to install Ubuntu 20.04 and dual boot alongside Windows 10 如何将 Ubuntu 20.04 和双启动与 Windows 10 一起安装 Dave’s RoboShack Published in…

2025 GDC开发者先锋大会“人形机器人的开源之路”分论坛 | 圆桌会议:《开放协作:开源生态如何解锁人形机器人与具身智能的未来》(上篇)

在GDC全球开发者先锋大会期间&#xff0c;2月23日&#xff0c;由GDC组委会指导、国家地方共建人形机器人创新中心&#xff08;以下简称“国地中心”&#xff09;承办的“人形机器人的开源之路”主题论坛在上海西岸艺术中心成功举办。 在人工智能与机器人技术飞速发展的今天&…

C# 牵手DeepSeek:打造本地AI超能力

一、引言 在人工智能飞速发展的当下&#xff0c;大语言模型如 DeepSeek 正掀起新一轮的技术变革浪潮&#xff0c;为自然语言处理领域带来了诸多创新应用。随着数据隐私和安全意识的提升&#xff0c;以及对模型部署灵活性的追求&#xff0c;本地部署 DeepSeek 成为众多开发者和…