我试图从Unity3D调用一个简单的本机函数(C ++)。我做了以下事情:
将libMSDKWrapper.so
放置在Assets-> Plugins-> Android
这是我的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);
}
}
我收到以下异常:
在文件名未知的[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)
答案 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#重写整个内容。