我有一个在Unity3d中使用的本地Android插件,现在需要创建一个64位android程序包。我希望在同一程序包中同时包含32位和64位。
我已修改Application.mk以构建4个插件 Application.mk看起来像这样:
APP_OPTIM := release
APP_ABI := armeabi-v7a arm64-v8a x86 x86_64
APP_PLATFORM := android-8
APP_BUILD_SCRIPT := Android.mk
我的构建plugin.sh看起来像这样:
#!/bin/sh
echo ""
echo "Compiling NativeCode.c..."
ANDROID_NDK_ROOT="/myapps/Android/android-ndk-r13b"
$ANDROID_NDK_ROOT/ndk-build NDK_PROJECT_PATH=. NDK_APPLICATION_MK=Application.mk $*
mv libs/armeabi-v7a/libnative.so ../libnative1.so
mv libs/arm64-v8a/libnative.so ../libnative2.so
mv libs/x86/libnative.so ../libnative3.so
mv libs/x86_64/libnative.so ../libnative4.so
echo ""
echo "Cleaning up / removing build folders..." #optional..
rm -rf libs
rm -rf obj
echo ""
echo "Done!"
我的插件代码NativeCode.c非常简单,看起来像这样:
#include <stdio.h>
#include <android/log.h>
#include <string.h>
void QDebug(const char *str)
{
__android_log_write(ANDROID_LOG_INFO, "QED", str);
}
当我运行.sh文件时,它将为每个目标平台创建4个zlibnative.so文件,大概是一个。我的问题是我如何在Unity3d插件目录中包含所有4个,以便Unity包使用正确的版本。
我得到的错误是:
DllNotFoundException:本机 06-07 18:13:07.617 29585 29608 E Unity:at(将包装器托管为本地)D:QDebug(字符串) 06-07 18:13:07.617 29585 29608 E Unity:位于D.logx(System.String格式,System.Object [] paramList)中的[0x00000] :: 0 06-07 18:13:07.617 29585 29608 E Unity:位于Sounds.Awake()[0x00000] in:0
当我只构建32位并且在plugins目录中只有一个Libnative.so时,它们都可以正常工作。
答案 0 :(得分:0)
检查为C#定义QDebug函数的脚本。
它具有DllImport指令,该指令列出了定义函数的插件的名称。对于您而言,它可能显示[DllImport(native)]或[DllImport(native1)]。
您的4个库应分别具有相同的文件名,但应位于Unity Assets目录下的单独目录中。然后,您可以从Unity内部检查每个元数据的元数据,以确保将其识别为仅适用于具有正确架构的Android。