Unity与 SO 交互 ☀️| 详细讲解 怎样通过 Android Studio 生成一个.so文件 并简单调用!

简介: 📢前言🎬SO文件生成🍺通过Android Studio生成.so文件🏳️‍🌈第一步:下载配置好NDK🏳️‍🌈第二步:新建一个AS工程,新建一个JniTest.java文件🏳️‍🌈第三步:选中JniTest.java文件,进行Make Project🏳️‍🌈第四步:新建一个jni文件夹,生成.h头文件🏳️‍🌈第五步:新建 一个c/c++source file文件test.c 和 Android.mk、Application.mk文件🏳️‍🌈第六步:关联下载好的NDK包🏳️‍🌈第七步:简单在AS端调用一下💬总结

📢前言

本文是介绍Unity与SO文件交互的系列文章

上一篇文章中简单介绍了SO文件的一个基本概念

那本篇文章就来学一下怎样生成一个so文件呢!

🎬SO文件生成

在写这篇教程和实际进行操作之前,我一直以为.so文件是通过C/C++端进行生成的


结果在网上查了一下.so文件的具体生成方法才知道,原来在Android Studio(下面统称AS)中也可以生成.so文件


使用文件的主要原因是:我们使用Android使用的是Java代码,但是有时候项目会调用底层的C/C++代码,所以需要用到JNI(Java Native interface),我们可以利用JNI使Java程序调用一些库,也就是调用这些so文件(一般都是C/C++写的),来完成调用底层的项目需求。


在介绍怎样生成.so文件之前还想要说一下JNI的,因为生成的时候会用到,那这里就简单介绍一下


“so”文件是使用C/C++编写生成的,在Android 平台上快速编译、打包该文件,它是一个动态链接库,而生成“so”文件其实就是JNI开发。


JNI全称为Java Native Interface(JAVA本地调用)。


从Java1.1开始,JNI成为java平台的一部分,它允许Java代码和其他语言写的代码(如C&C++)进行交互。

并非从Android发布才引入JNI的概念的。

JNI是一个协议,这个协议用来沟通java代码和外部的本地代码(c/c++),外部的c/c++代码也可以调用java代码。

🍺通过Android Studio生成.so文件

生成.so文件有好几种方法,那现在就先用Android Studio来生成一下试试


🏳️‍🌈第一步:下载配置好NDK

先下载一下NDK,然后配置环境变量,已经配置好NDK的这一步可以省略!

可以在网上下载ndk下载地址: https://developer.android.com/ndk/downloads/index.html


也可以直接在AS中进行下载

image.png

打开系统高级设置,右键此电脑,点击高级系统设置,就可以进入环境变量配置


新建一个系统变量:NDK_HOME,变量值就是放这个NDK的路径,如下图所示

image.png

再编辑一下Path变量,加入这行字符:;%NDK_HOME %

image.png

最后打开命令指示符,输入:ndk-build


如果出现下图所示,说明安装成功了!

image.png


🏳️‍🌈第二步:新建一个AS工程,新建一个JniTest.java文件

打开AS,新建一个项目,然后再新建一个JniTest.java文件。这一步很简单不用多说了

image.png

JniTest.java内容

image.png


🏳️‍🌈第三步:选中JniTest.java文件,进行Make Project

选中JniTest.java文件,Build - > Make Project


image.png


然后等待 AS 执行编译,会在Build目录下生成 .class文件,然后记住这个JniTest的路径,后面会用到


我这里的路径是:F:\anyun\android\UnitysoTest\app\build\intermediates\javac\debug\classes com.example.unitysotest

image.png


🏳️‍🌈第四步:新建一个jni文件夹,生成.h头文件

在app -> src -> main 下新建一个文件夹jni

image.png

然后点击下面的Terminal打开AS的终端


先 cd 到这个 jni 目录下,每个人的目录不一样,看看自己的这个jni路径是多少


选中jni右键 -> Show in Explorer,会跳转到文件管理器的具体路径

image.png

image.png

cd 到这个jni文件夹下之后,再输入以下命令


这里注意,javah -jni -classpath后面的路径是第三步中我们生成的

javah -jni -classpath  F:\anyun\android\UnitysoTest\app\build\intermediates\javac\debug\classes com.example.unitysotest.JniTest

具体操作示例图如下:

image.png

然后执行完之后,正常情况下是没问题的,然后等待 AS 反应一会,或者直接点一下编译 sync


会发现已经在我们这个 jni文件夹下生成了一个 com_brotherd_jnihelloworld_JniTest.h文件


image.png


🏳️‍🌈第五步:新建 一个c/c++source file文件test.c 和 Android.mk、Application.mk文件

是在scr/main/jni目录下,新建一个c/c++source file,取名test.c实现上面.h文件中的方法。

image.png


test.c代码内容

#include "jni.h"
#include "com_example_unitysotest_JniTest"
JNIEXPORT jstring JNICALL Java_com_example_unitysotest_JniTest_getString
  (JNIEnv *env, jclass jz){
  return (*env)->NewStringUTF(env,"呆呆敲代码的小Y使用 jni做测试!");
  }


继续在 jni文件夹下,新建Android.mk和Application.mk文件。


直接右键新建这两个文件即可,或者在文件管理器新建个文本改成这两个文件相同名即可,一定要戴着.mk后缀

image.png

Android.mk 代码内容:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := JniTest
LOCAL_SRC_FILES := Test.c
include $(BUILD_SHARED_LIBRARY)

Application.mk 代码内容

APP_ABI := all

🏳️‍🌈第六步:关联下载好的NDK包

可以打开File - > Other Setting -> Default Project Structure..查看 NDK文件 位置

image.png

我的 NDK路径如下

image.png

然后再次打开 AS 的终端,cd进入到jni目录下,输入指令:ndk-build


然后等待 AS 执行完成即可,会发现main目录下已经生成对应的so文件,终端提示如下:image.png


这样的话我们的so文件就已经生成完毕了

image.png


🏳️‍🌈第七步:简单在AS端调用一下

在app的 bulid 文件中加入如下代码,然后 build project

android {
    ...
    sourceSets {
        main() {
            jniLibs.srcDirs = ['src/main/libs']
            jni.srcDirs = [] //屏蔽掉默认的jni编译生成过程
        }
    }
}

image.png然后在MainActivity中简单写代码调用一下

package com.example.unitysotest;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
    private TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.textView);
        textView.setText(JniTest.getString());
    }
}

image.png如果这里的id部分报错的话,说明我们的xml视图没有添加id


如下所示,找到XML文件,加上一行代码即可!

image.png


看一下运行效果图,如下所示,代表这个so可以调用成功啦!

image.png


💬总结

本文对如何通过Android Studio生成so文件做了一个详细的说明 介绍

当然实际情况中的c++文件内容肯定特别多,我们这里只是做了一个很简单的测试Demo

并且对这个so文件进行了一个简单的调用,一般的调用还是很简单的,并没有很复杂!

那本篇文章就算结束了,下一篇来看一下有了这个so文件之后,在Unity端该如何调用交互的!


相关文章
|
4月前
|
人机交互 开发工具 vr&ar
使用Unity引擎开发Rokid主机应用的模型交互操作
本文介绍如何使用Unity引擎结合Rokid OpenXR Plugin开发空间计算应用,实现射线交互、模型操作等功能。涵盖环境配置、Demo导入、UI搭建与脚本编写,助力开发者快速构建AR交互应用。
|
Java Linux Android开发
移动应用开发与操作系统的交互:深入理解Android和iOS
在数字时代,移动应用成为我们日常生活的一部分。本文将深入探讨移动应用开发的核心概念、移动操作系统的工作原理以及它们如何相互作用。我们将通过实际代码示例,展示如何在Android和iOS平台上创建一个简单的“Hello World”应用,并解释其背后的技术原理。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和知识。
|
前端开发 图形学 开发者
【独家揭秘】那些让你的游戏瞬间鲜活起来的Unity UI动画技巧:从零开始打造动态按钮,提升玩家交互体验的绝招大公开!
【9月更文挑战第1天】在游戏开发领域,Unity 是最受欢迎的游戏引擎之一,其强大的跨平台发布能力和丰富的功能集让开发者能够迅速打造出高质量的游戏。优秀的 UI 设计对于游戏至关重要,尤其是在手游市场,出色的 UI 能给玩家留下深刻的第一印象。Unity 的 UGUI 系统提供了一整套解决方案,包括 Canvas、Image 和 Button 等组件,支持添加各种动画效果。
1090 3
|
vr&ar 图形学 API
Unity与VR控制器交互全解:从基础配置到力反馈应用,多角度提升虚拟现实游戏的真实感与沉浸体验大揭秘
【8月更文挑战第31天】虚拟现实(VR)技术迅猛发展,Unity作为主流游戏开发引擎,支持多种VR硬件并提供丰富的API,尤其在VR控制器交互设计上具备高度灵活性。本文详细介绍了如何在Unity中配置VR支持、设置控制器、实现按钮交互及力反馈,结合碰撞检测和物理引擎提升真实感,助力开发者创造沉浸式体验。
1016 1
|
开发者 图形学 Java
Unity物理引擎深度揭秘:从刚体碰撞到软体模拟,全面解析实现复杂物理交互的技巧与秘诀,助你打造超真实游戏体验
【8月更文挑战第31天】物理模拟在游戏开发中至关重要,可让虚拟世界更真实。Unity作为强大的跨平台游戏引擎,内置物理系统,支持从刚体碰撞到布料模拟的多种功能。通过添加Rigidbody组件,可实现物体受力和碰撞;使用AddForce()施加力;通过关节(如Fixed Joint)连接刚体以模拟复杂结构。Unity还支持软体物理,如布料和绳索模拟,进一步增强场景丰富度。掌握这些技术,可大幅提升游戏的真实感和玩家体验。
969 1
|
XML Android开发 UED
"掌握安卓开发新境界:深度解析AndroidManifest.xml中的Intent-filter配置,让你的App轻松响应scheme_url,开启无限交互可能!"
【8月更文挑战第2天】在安卓开发中,scheme_url 通过在`AndroidManifest.xml`中配置`Intent-filter`,使应用能响应特定URL启动或执行操作。基本配置下,应用可通过定义特定URL模式的`Intent-filter`响应相应链接。
439 12
|
图形学 Android开发 iOS开发
穿越数字洪流,揭秘Unity3d中的视频魔法!Windows、Android和iOS如何征服RTSP与RTMP的终极指南!
【8月更文挑战第15天】在数字媒体的海洋中,实时视频流是连接世界的桥梁。对于那些渴望在Unity3d中搭建这座桥梁的开发者来说,本文将揭示如何在Windows、Android和iOS平台上征服RTSP与RTMP的秘密。我们将深入探讨这两种协议的特性,以及在不同平台上实现流畅播放的技巧。无论你是追求稳定性的RTSP拥趸,还是低延迟的RTMP忠实粉丝,这里都有你需要的答案。让我们一起穿越数字洪流,探索Unity3d中视频魔法的世界吧!
484 2
|
Java 网络安全 开发工具
UNITY与安卓⭐一、Android Studio初始设置
UNITY与安卓⭐一、Android Studio初始设置
|
图形学 Android开发
小功能⭐️Unity调用Android常用事件
小功能⭐️Unity调用Android常用事件
|
图形学 iOS开发 Android开发
从Unity开发到移动平台制胜攻略:全面解析iOS与Android应用发布流程,助你轻松掌握跨平台发布技巧,打造爆款手游不是梦——性能优化、广告集成与内购设置全包含
【8月更文挑战第31天】本书详细介绍了如何在Unity中设置项目以适应移动设备,涵盖性能优化、集成广告及内购功能等关键步骤。通过具体示例和代码片段,指导读者完成iOS和Android应用的打包与发布,确保应用顺利上线并获得成功。无论是性能调整还是平台特定的操作,本书均提供了全面的解决方案。
723 0

热门文章

最新文章