Unity3d </filename>中的<filename unknown =“”>中的system.entrypointnotfoundexception

时间:2013-03-22 14:32:23

标签: c# unity3d native-code

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

  1. libMSDKWrapper.so放置在Assets-&gt; Plugins-&gt; 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);
            }
    }
    
  3. 我收到以下异常:

      在文件名未知的[0x00000]处的

    system.entrypointnotfoundexception:0

    我使用命令

    使用相同的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):共享库'/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(包装器托管到原生)SocialAccess:getContextNative() 03-25 11:40:17.598:I / Unity(26176):在SocialAccess.OnClick()[0x00000]中: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)

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

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

@Virtlink我知道它是一个专业版的功能,但看起来Unity只会在使用p / invokes时发出警告。如果Unity在V4中修复它,我就不会使用,但是V3允许你使用它们。审判也足够了。

正如另一个注释,是否有一个特定的原因你需要使用C ++ DLL?几乎在所有情况下,您都可以在托管C#代码中执行您想要的操作。绝对确定您需要此DLL,因为它会破坏与单个代码库的交叉兼容性。有了我的dll,我决定废弃我的用例并用c#重写整个内容。