本文章是Unity与 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
中进行下载
打开系统高级设置,右键此电脑,点击高级系统设置,就可以进入环境变量配置
新建一个系统变量:NDK_HOME
,变量值就是放这个NDK的路径
,如下图所示
再编辑一下Path变量,加入这行字符:;%NDK_HOME %
最后打开命令指示符,输入:ndk-build
如果出现下图所示,说明安装成功了!
🏳️🌈第二步:新建一个AS工程,新建一个JniTest.java文件
打开AS
,新建一个项目,然后再新建一个JniTest.java
文件。这一步很简单不用多说了
JniTest.java内容
🏳️🌈第三步:选中JniTest.java文件,进行Make Project
选中JniTest.java文件,Build - > Make Project
然后等待 AS
执行编译,会在Build目录下生成 .class
文件,然后记住这个JniTest
的路径,后面会用到
我这里的路径是:F:\anyun\android\UnitysoTest\app\build\intermediates\javac\debug\classes com.example.unitysotest
🏳️🌈第四步:新建一个jni文件夹,生成.h头文件
在app -> src -> main
下新建一个文件夹jni
然后点击下面的Terminal
打开AS的终端
先 cd
到这个 jni 目录下,每个人的目录不一样,看看自己的这个jni
路径是多少
选中jni右键 -> Show in Explorer
,会跳转到文件管理器的具体路径
cd
到这个jni
文件夹下之后,再输入以下命令
这里注意,javah -jni -classpath
后面的路径是第三步中我们生成的
javah -jni -classpath F:\anyun\android\UnitysoTest\app\build\intermediates\javac\debug\classes com.example.unitysotest.JniTest
具体操作示例图如下:
然后执行完之后,正常情况下是没问题的,然后等待 AS
反应一会,或者直接点一下编译 sync
会发现已经在我们这个 jni
文件夹下生成了一个 com_brotherd_jnihelloworld_JniTest.h
文件
🏳️🌈第五步:新建 一个c/c++source file文件test.c 和 Android.mk、Application.mk文件
是在scr/main/jni
目录下,新建一个c/c++source file
,取名test.c
实现上面.h文件
中的方法。
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
后缀
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文件
位置
我的 NDK
路径如下
然后再次打开 AS 的终端,cd进入到jni目录下,输入指令:ndk-build
然后等待 AS 执行完成即可,会发现main目录下已经生成对应的so文件
,终端提示如下:
这样的话我们的so文件
就已经生成完毕了
🏳️🌈第七步:简单在AS端调用一下
在app的 bulid
文件中加入如下代码,然后 build project
android {
...
sourceSets {
main() {
jniLibs.srcDirs = ['src/main/libs']
jni.srcDirs = [] //屏蔽掉默认的jni编译生成过程
}
}
}
然后在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());
}
}
如果这里的id
部分报错的话,说明我们的xml
视图没有添加id
如下所示,找到XML文件,加上一行代码即可!
看一下运行效果图,如下所示,代表这个so可以调用成功啦!
💬总结
- 本文对如何通过
Android Studio
生成so文件
做了一个详细的说明 介绍 - 当然实际情况中的
c++文件
内容肯定特别多,我们这里只是做了一个很简单的测试Demo
- 并且对这个
so文件
进行了一个简单的调用,一般的调用还是很简单的,并没有很复杂! - 那本篇文章就算结束了,下一篇来看一下有了这个so文件之后,在Unity端该如何调用交互的!
- 🎄如果感觉文章看完了不过瘾,可以来我的其他 专栏 看一下哦~
- 🎄比如以下几个专栏:Unity基础知识学习专栏、Unity游戏制作专栏、Unity实战类项目 和 算法学习专栏
- 🎄可以学习更多的关于Unity引擎的相关内容哦!直接点击下面颜色就可以跳转啦!
🚀 优质专栏分享 🚀 |
🎄 Unity基础知识学习专栏 🎄 ⭐️ Unity游戏制作专栏 ⭐️ 🍇 Unity实战类项目 🍇 💦 小Y学算法 💦
🚀 优质专栏分享 🚀 |