如何为32位和64位统一构建android NDK插件

时间:2019-06-07 08:28:37

标签: android unity3d plugins android-ndk

我有一个在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时,它们都可以正常工作。

1 个答案:

答案 0 :(得分:0)

检查为C#定义QDebug函数的脚本。

它具有DllImport指令,该指令列出了定义函数的插件的名称。对于您而言,它可能显示[DllImport(native)]或[DllImport(native1)]。

您的4个库应分别具有相同的文件名,但应位于Unity Assets目录下的单独目录中。然后,您可以从Unity内部检查每个元数据的元数据,以确保将其识别为仅适用于具有正确架构的Android。