Unity调用Java——直接使用.java文件

从Unity2018.2开始,Unity开始支持使用Java或Kotlin源码文件作为插件直接导入Unity工程中使用。在构建Android时会编译这些源码。使用这个功能必须要设置Android构建系统为Gradle,Unity2019好像只有gradle一种构建系统了

使用方法:

1.创建一个Android空白工程,并新建一个Java类用于写Java端的功能

package com.test;

import android.content.Context;
import android.widget.Toast;

public class MyJavaClass{
    public void showToast(Context act, String msg){
        Toast.makeText(act, msg, Toast.LENGTH_LONG).show();
    }
}

2.把第1步创建的java文件直接拖进Unity工程的Plugins目录,在Inspector面板可以直接看到.java插件配置信息。构建安卓时会自动根据该java类的包名在安卓工程的src下创建好对应的目录,并把这个java文件复制该目录下,然后编译这个安卓工程生成apk

3.在C#中实例化Java类并调用Java方法

①实例化Java对象

AndroidJavaObject jo = new AndroidJavaObject("com.test.MyJavaClass");

②调用Java方法

jo.Call("showToast", actObj,"Unity 调用 Java");

由于Java代码的Toast.makeText()方法需要传入一个Context参数, 所以我们要获取游戏的Activity传给java

AndroidJavaClass act = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
var actObj = act.GetStatic<AndroidJavaObject>("currentActivity");
jo.Call("showToast", actObj,"Unity 调用 Java");

这样就完成了用C#调用Java显示Toast的功能,相比导jar包的方式更简单方便了很多

Unity游戏引擎中集成和使用 `.so` (共享库) 文件可以让开发者利用外部的本地代码来增强应用的功能,特别是当需要高性能计算、硬件加速或者其他特殊功能时。由于 Unity 主要用于开发跨平台的应用程序,在 Android 和 Linux 平台上可以方便地引入 `.so` 动态链接库。下面我们将详细介绍如何在 Unity 中正确导入及调用 `.so` 库。 ### 准备工作 1. **获取或创建 `.so` 文件**:确保已经有了目标平台上编译好的 `.so` 文件,并且该文件提供了一个明确的 API 接口供 Unity 调用。例如,假设我们有一个名为 `libMyPlugin.so` 的安卓原生库,它实现了几个 C/C++ 方法以供 Java 层面访问。 2. **设置 Android NDK 环境**:为了能够编写和编译 JNI (Java Native Interface) 代码,你需要安装 Android NDK(Native Development Kit)。NDK 包含了一系列工具链和其他资源,可以帮助你在 C/C++ 下为 Android 设备构建应用程序。 3. **准备头文件 (.h)** :如果有相应的头文件描述了 .so 提供给用户的函数原型,则应将其放置在同一目录下;如果没有现成的头文件,你可能需要参考文档手动撰写它们。 4. **建立桥接层**:为了让 C# 语言可以直接调用这些本地方法,通常还需要写一些“桥梁”代码 —— 这些代码一般位于 C++ 或者 Java 上(取决于你的需求),并通过JNI机制与托管代码交互。 对于 Android 来说,这一步意味着你需要编写一个 Java 类来封装对本地库的所有调用。而如果是针对桌面端Linux版本的话则只需要直接写出DLLImport属性标注的方法即可。 5. **打包 APK 或者 AAR** : 如果你是打算分发给他人使用的插件包,请考虑将 `.so` 和配套的 Java 桥梁一起打包成AAR格式更便于用户引用。 ### 在 Unity 中部署 SO 文件 #### 方式一:通过 AssetBundle 导入 你可以选择把整个Android项目作为一个Assetbundle加入工程内,但这不是最理想的做法因为它增加了不必要的复杂度而且维护起来麻烦。 #### 方式二:直接放入Plugins 文件夹 更为简便有效的方法就是直接把你获得的 `.so` 放置到 Unity 工程下的特定路径里面。Unity 默认会在运行期自动扫描 Plugins 文件夹及其子文件夹查找适合当前设备架构类型的动态链接库。 - 将 `armeabi-v7a/libMyPlugin.so`, `arm64-v8a/libMyPlugin.so` 分别置于对应架构名命名的子目录之下; - 同样也需要保证有正确的ABIs支持列表设定在Player Settings里。 #### 方式三:自定义 Gradle 构建脚本 如果涉及到较复杂的场景,比如需要修改默认Gradle模板或者调整某些高级选项的时候就可以采用此方案。不过这里不再展开讨论以免混淆主题重点。 ### 加载并调用本地库 一旦完成了前面几步之后,现在可以在 C# Scripting 中轻松加载所需的 `.so` 库并与之通信啦! ```cs using UnityEngine; public class MyPluginWrapper : MonoBehaviour { [DllImport ("MyPlugin")] // 注意这里的名称不需要带前缀 "lib" private static extern int nativeFunction(int param); void Start(){ Debug.Log("Calling into the plugin..."); var result = nativeFunction(10); Debug.Log($"Result from Plugin: {result}"); } } ``` 需要注意的是 `[DllImport]` 标记里的字符串应当与你放在 plugins 文件夹里面的 so 名称一致但去掉开头的 “lib”。此外还需注意不同操作系统间 ABI 兼容性的问题以及内存管理和线程安全等方面的要求。 --- 总之,在 Unity使用 `.so` 文件虽然看起来有些繁琐,但实际上按照规范一步步去做是非常容易掌握的过程。掌握了这一技能后不仅能让你的游戏性能得到极大提升还拓宽了解决问题的技术思路!
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值