【问题标题】:system.entrypointnotfoundexception in <Filename unknown> in Unity3dUnity3d 中 <文件名未知> 中的 system.entrypointnotfoundexception
【发布时间】:2013-03-22 14:32:22
【问题描述】:

我正在尝试从 Unity3D 调用一个简单的本机函数 (C++)。我做了以下事情:

  1. libMSDKWrapper.so 放在Assets->Plugins->Android

  2. 这是我的 C# 代码

    using UnityEngine;
    using System.Collections;
    using System.Runtime.InteropServices;
    
    public class facebooktest : MonoBehaviour {
    
        [DllImport ("MSDKWrapper")]
        private static extern long getContextNative();
    
        void Start () {
            Debug.Log("Hello, World!");
            long context = getContextNative(); // <-- Exception thrown here
            Debug.Log(context);
            }
    }
    

我收到以下异常:

system.entrypointnotfoundexception at [0x00000] in Filename unknown:0

我使用 java 使用相同的 libMSDKWrapper.so 使用命令

System.loadLibrary("MSDKWrapper");

并且我能够访问和使用 getContextNative() 方法。

编辑 1:我解压了 apk 的内容,发现 libMSDKWrapper.so 文件存在于 test.apk/lib/armeabi-v7a 中

编辑 2:这里是 logcat 日志。 03-25 11:40:17.543: D/dalvikvm(26176): 试图加载 lib /data/data/com.disney.citygirl.goo/lib/libMSDKWrapper.so 0x41566348 03-25 11:40:17.568:D/MSDK(26176):注册提供者:SN_COMMUNITY 03-25 11:40:17.568:D/MSDK(26176):注册提供者:SN_FACEBOOK 03-25 11:40:17.568: D/dalvikvm(26176): 添加共享库 /data/data/com.disney.citygirl.goo/lib/libMSDKWrapper.so 0x41566348 03-25 11:40:17.568: I/MSDK(26176): JNI_OnLoad 调用 03-25 11:40:17.573: D/dalvikvm(26176): 试图加载 lib /data/data/com.disney.citygirl.goo/lib/libMSDKWrapper.so 0x41566348 03-25 11:40:17.573: D/dalvikvm(26176): Shared lib '/data/data/com.disney.citygirl.goo/lib/libMSDKWrapper.so' 已经加载到同一个 CL 0x41566348 03-25 11:40:17.598: I/Unity(26176): System.EntryPointNotFoundException: getContextNative 03-25 11:40:17.598: I/Unity(26176): at (wrapper managed-to-native) SocialAccess:getContextNative () 03-25 11:40:17.598: I/Unity(26176): 在 SocialAccess.OnClick () [0x00000] in :0 03-25 11:40:17.598: I/Unity(26176):
03-25 11:40:17.598:I/Unity(26176):(文件名:./Runtime/ExportGenerated/AndroidManaged/UnityEngineDebug.cpp 行:43)

【问题讨论】:

  • 我们需要查看 .dll 的实现。可能缺少依赖项。

标签: c# unity3d native-code


【解决方案1】:

您正在使用 C++ 插件,但您的 Unity3D 版本可能不支持它?我记得你需要 Pro 才能做到这一点。

This page 可能会提供解决方案。

【讨论】:

  • 这是我关注的页面。我也有 unity pro 的 30 天评估版。
【解决方案2】:

确保您使用 extern 'c' 指令来避免name-mangling issues。如果您不将调用“包装”在“c”方法名称中,您将得到这种确切的行为,因为 c++ 编译器会“破坏”或在方法名称中添加额外的体系结构特定的“垃圾”。有问题可以参考我的github项目HERE

关注 main.cpp (在 android-src/ 中的入口点与在根目录中的相同)。这就是你需要为你的 c++ dll 建模的模式。该项目还将向您展示如何为 android 构建 c++ dll。查看 README 以获取 Ubuntu(和其他类似 Debian 的操作系统)和 android 的完整构建说明。

@Virtlink 我知道它是一个专业功能,但似乎 Unity 在使用 p/invokes 时只会发出警告。如果 Unity 在 V4 中修复了这个问题,我不会使用它,但 V3 允许您无论如何都可以使用它们。审判也足够了。

正如另一个注意事项,您是否有特定原因需要使用 C++ dll?在几乎所有情况下,您都可以在托管 C# 代码中做您想做的事情。绝对确定您需要此 DLL,因为它会破坏与单个代码库的交叉兼容性。使用我的 dll,我决定放弃我的用例并用 c# 重新编写整个东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-07
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多