系统.entrypointnotfoundexception in <文件名未知>Unity3d

本文关键字:未知 Unity3d 文件名 entrypointnotfoundexception in 系统 | 更新日期: 2023-09-27 18:05:14

我试图从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);
            }
    }
    

我得到以下异常:

系统。entrypointnotfoundexception at [0x00000] in Filename unknown:0

我使用了相同的libMSDKWrapper。所以在Java中使用命令

System.loadLibrary("MSDKWrapper");

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

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

编辑2:这是logcat日志。3-25 11:40:17.543: D/dalvikvm(26176):试图加载lib/data/data/com.disney.citygirl.goo/lib/libMSDKWrapper。0 x4156634803-25 11:40:17.568: D/MSDK(26176): Register Provider: SN_COMMUNITY . log03:25 11:40:17.568: D/MSDK(26176): Register Provider: SN_FACEBOOK . log03-25 11:40:17.568: D/dalvikvm(26176):添加共享lib/data/data/com.disney.citygirl.goo/lib/libMSDKWrapper。0 x4156634803-25 11:40:17.568: I/MSDK(26176): JNI_OnLoad被调用3-25 11:40:17.573: D/dalvikvm(26176):试图加载lib/data/data/com.disney.citygirl.goo/lib/libMSDKWrapper。0 x4156634803-25 11:40:17.573: D/dalvikvm(26176): Shared lib '/data/data/com.disney.citygirl.goo/lib/libMSDKWrapper。so'已经加载在相同的CL 0x4156634803-25 11:40:17.598: I/Unity(26176): System。EntryPointNotFoundException: getContextNative03:25 11:40:17.598: I/Unity(26176): at (wrapper managed-to-native) SocialAccess:getContextNative ()03-25 11:40:17.598:我/Unity(26176):在SocialAccess。OnClick () [0x00000] in:003-25 11:40:17.598: I/Unity(26176):
03-25 11:40:17.598: I/Unity(26176):(Filename: ./Runtime/ExportGenerated/AndroidManaged/UnityEngineDebug.cpp Line: 43)

系统.entrypointnotfoundexception in <文件名未知>Unity3d

您正在使用c++插件,但也许您的Unity3D版本不支持它?我记得你需要Pro来做这件事。

此页可能提供一个解决方案。

确保使用的是extern 'c'指令,以避免名称混淆问题。如果你不把你的调用"包装"在'c'方法名中,你会得到这种确切的行为,因为c++编译器'mangles'或添加额外的特定于体系结构的'垃圾'到方法名中。如果你有问题,你可以参考我的github项目在这里

关注main.cpp (android-src/中的入口点与根目录中的入口点相同)。这就是您需要按照的模式来对c++ dll进行建模。本项目还将向您展示如何为android构建c++ dll。有关Ubuntu(以及其他类似debian的操作系统)和android的完整构建说明,请参阅README。

@Virtlink我知道这是一个专业的功能,但似乎Unity只会在使用p/invoke时给出警告。如果Unity在V4中修复了这个问题,我不使用,但V3允许你使用它们。审判也足够了。

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