hpohl
June 27, 2017, 4:28pm
1
Creating a simple C++ plugin from source:
#include <iostream>
struct S {
S() {
std::cout << "S constructed" << std::endl;
}
};
S s;
extern "C" void abc_func() {
std::cout << "abc_func" << std::endl;
}
em++ main.cpp -o libfoo.bc
Using it:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Runtime.InteropServices;
public class Script : MonoBehaviour {
[DllImport("foo")]
public static extern void abc_func();
// Use this for initialization
void Start () {
abc_func();
}
// Update is called once per frame
void Update () {
}
}
Then adding it to Assets in a clean Unity Project, ticking WebGL only and building.
Output:
I remember it working earlier. Using Unity 5.6.1 on Linux, emscripten 1.37.5. Chrome 59.
Before Unity 5.6 or 5.6.1?
hpohl
June 28, 2017, 8:57am
3
I just tried it with 5.5.2 and got the same issue. I am sure I was able to call a C++ function and print something on the console without any issues at some point. It is also printing “S constructed” on startup, which means the library has been linked successfully to the asm.js build. Not sure where the “dlopen” comes from:
UnityLoader.js:3262 run() called, but dependencies remain, so not running
Module.printErr @ UnityLoader.js:3262
run @ blob:http://127.0.0.1:8080/3c883641-0857-46a7-a467-cc7a4d8483e9:17939
(anonymous) @ blob:http://127.0.0.1:8080/3c883641-0857-46a7-a467-cc7a4d8483e9:18027
UnityLoader.js:3258 S constructed
UnityLoader.js:3262 pre-main prep time: 73 ms
Invoking error handler due to
Uncaught abort(“To use dlopen, you need to use Emscripten’s linking support, see Linking · emscripten-core/emscripten Wiki · GitHub ”) at Error
at jsStackTrace (Build.js:859:12)
at stackTrace (Build.js:873:11)
at abort (Build.js:18007:43)
at _dlopen (Build.js:7778:2)
at il2cpp: s::LibraryLoader::LoadDynamicLibrary(il2cpp::utils::StringView const&) [__ZN6il2cpp2os13LibraryLoader18LoadDynamicLibraryERKNS_5utils10StringViewIcEE] (Build.asm.js:668208:16)
at il2cpp::vm::LibraryLoader::LoadLibrary(il2cpp::utils::StringView) [__ZN6il2cpp2vm13LibraryLoader11LoadLibraryENS_5utils10StringViewIcEE] (Build.asm.js:751690:9)
at il2cpp::vm::platformInvoke::Resolve(PInvokeArguments const&) [__ZN6il2cpp2vm14PlatformInvoke7ResolveERK16PInvokeArguments] (Build.asm.js:165229:9)
at void (il2cpp_codegen_resolve_pinvoke<void ( )(), 4u, 9u>(char const (&) [4u], char const (&) [9u], Il2CppCallConvention, Il2CppCharSet, int, bool))() [__Z30il2cpp_codegen_resolve_pinvokeIPFvvELj4ELj9EET_RAT0__KcRAT1__S3_20Il2CppCallConvention13Il2CppCharSetib] (Build.asm.js:845530:7)
at _Script_abc_func_m3191899169 (Build.asm.js:895014:8)
at _Script_Start_m2696305298 [Array._Script_Start_m2696305298] (Build.asm.js:900545:2)
at RuntimeInvoker_Void_t1841601450(MethodInfo const*, void*, void**) [Array._Z31RuntimeInvoker_Void_t1841601450PK10MethodInfoPvPS2 ] (Build.asm.js:979155:44)
at dynCall_iiii [Object.dynCall_iiii] (Build.asm.js:986527:39)
at invoke_iiii (Build.js:15462:32)
at il2cpp::vm::Runtime::Invoke(MethodInfo const*, void*, void**, Il2CppException**) [__ZN6il2cpp2vm7Runtime6InvokeEPK10MethodInfoPvPS5_PP15Il2CppException] (Build.asm.js:819327:8)
at _il2cpp_runtime_invoke (Build.asm.js:938375:9)
at scripting_method_invoke(ScriptingMethodIl2Cpp, Il2CppObject*, ScriptingArguments&, Il2CppException**, bool) [__Z23scripting_method_invoke21ScriptingMethodIl2CppP12Il2CppObjectR18ScriptingArgumentsPP15Il2CppExceptionb] (Build.asm.js:878513:8)
at ScriptingInvocation::Invoke(Il2CppException**, bool) [__ZN19ScriptingInvocation6InvokeEPP15Il2CppExceptionb] (Build.asm.js:632676:7)
at MonoBehaviour::InvokeMethodOrCoroutineChecked(ScriptingMethodIl2Cpp, Il2CppObject*, Il2CppException**) [__ZN13MonoBehaviour30InvokeMethodOrCoroutineCheckedE21ScriptingMethodIl2CppP12Il2CppObjectPP15Il2CppException] (Build.asm.js:195784:9)
at MonoBehaviour::InvokeMethodOrCoroutineChecked(ScriptingMethodIl2Cpp, Il2CppObject*) [__ZN13MonoBehaviour30InvokeMethodOrCoroutineCheckedE21ScriptingMethodIl2CppP12Il2CppObject] (Build.asm.js:631572:7)
at MonoBehaviour: elayedStartCall(Object*, void*) [Array.__ZN13MonoBehaviour16DelayedStartCallEP6ObjectPv] (Build.asm.js:748755:2)
at DelayedCallManager::Update(int) [Array.__ZN18DelayedCallManager6UpdateEi] (Build.asm.js:309434:62)
at InitPlayerLoopCallbacks()::EarlyUpdateScriptRunDelayedStartupFramestruct::Forward() [Array.__ZZ23InitPlayerLoopCallbacksvEN45EarlyUpdateScriptRunDelayedStartupFramestruct7ForwardEv] (Build.asm.js:959856:69)
at PlayerLoop() [__Z10PlayerLoopv] (Build.asm.js:230266:40)
at MainLoop() [Array.__ZL8MainLoopv] (Build.asm.js:654468:3)
at dynCall_v (Build.asm.js:1010608:28)
at dynCall [Object.dynCall] (Build.js:299:36)
at browserIterationFunc (Build.js:2063:12)
at runIter [Object.runIter] (Build.js:2165:5)
at Browser_mainLoop_runner (Build.js:2101:20)
hpohl
June 28, 2017, 9:42am
4
If I use [DllImport(“__Internal”)] it works. Kind of unintentional though.
Second problem: My .bc contains embedded JS using --pre-js. It never gets to run.
How did you embed JS? Have you tried to to add your JS to Unity as a .jspre file instead ?