2

我正在尝试从 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

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

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/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:
03-25 11:40:17.598:I/Unity(26176):(文件名:./Runtime/ExportGenerated/AndroidManaged/UnityEngineDebug.cpp 行:43)

4

2 回答 2

2

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

此页面可能会提供解决方案。

于 2013-03-22T14:36:04.893 回答
0

确保您使用 extern 'c' 指令来避免名称混淆问题。如果您不将调用“包装”在“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# 重新编写了整个内容。

于 2013-04-17T21:54:08.667 回答