Thank you Floh I'll keep trying. :-)
On Thu, Apr 15, 2021, 4:40 AM Floh <[email protected]> wrote: > Can't help with that sorry, it looks like a problem that the _addc() > function is being called before it has been imported (in the example > project, a similar problem (but for loading the WASM module) is the reason > why all the important JS code is inside that 'onRuntimeInitialized()' > callback: > > > https://github.com/floooh/emsc-interop-demo/blob/cab711986cb9cbc352aed467553cad4c1e4b8d4d/shell.html#L10-L17 > > ...but without this, I get a simple "_addc() is undefined" error message > in the browsers JS console, not the fancy error message you're seeing > (that's why my guess is that your error message is coming from the module > system via the line "import {_addc}...", which probably also happens > asynchronously, but I don't have experience with this new-fangled module > stuff ;) > On Thursday, 15 April 2021 at 07:15:12 UTC+2 HJ wrote: > >> I have not found the answer to life, the universe and everything yet... >> >> I created the hello.js based on Floh's code. I did one change in that I >> added the "-s WASM=0" to the emcc command line to only produce JS and not >> any WASM. (I assume that is ok for my goal.) >> >> I added hello.js to my MS Code project and then try calling the "_addc" >> in hello by adding the following in my main TypeScript file app.ts: >> >> at the top of app.ts: >> >> import {_addc} from './app/util/hello.js'; >> >> and in the body of app.ts: >> >> const myResult = _addc(10,20); >> console.log('....................................' + myResult + >> '-------------------------') >> >> ====================================== >> It built, but when I run, I get the following error: native function >> `addc` called before runtime initialization >> ====================================== >> >> $ yarn start >> yarn run v1.22.10 >> warning package.json: License should be a valid SPDX license expression >> warning ../../package.json: License should be a valid SPDX license >> expression >> warning ../../../../package.json: No license field >> $ node dist/index.js >> GPProcessAPIService constructor >> Assertion failed: native function `addc` called before runtime >> initialization >> >> /Users/me/Desktop/cg-process-api/src/production/cg-process-api/dist/app/util/hello.js:102 >> throw ex; >> ^ >> >> Error: abort(Assertion failed: native function `addc` called before >> runtime initialization) at Error >> at jsStackTrace >> (/Users/me/Desktop/gp/gp-process-api/gp-process-api/src/production/gp-process-api/dist/app/util/hello.js:1856:17) >> at stackTrace >> (/Users/me/Desktop/gp/gp-process-api/gp-process-api/src/production/gp-process-api/dist/app/util/hello.js:1873:14) >> at abort >> (/Users/me/Desktop/gp/gp-process-api/gp-process-api/src/production/gp-process-api/dist/app/util/hello.js:1614:46) >> at assert >> (/Users/me/Desktop/gp/cg-process-api/gp-process-api/src/production/gp-process-api/dist/app/util/hello.js:856:9) >> at Object._addc >> (/Users/me/Desktop/gp/gp-process-api/cgps-process-api/src/production/gp-process-api/dist/app/util/hello.js:1671:9) >> at Object.<anonymous> >> (/Users/me/Desktop/gp/gp-process-api/gp-process-api/src/production/gp-process-api/dist/app.js:59:29) >> at Module._compile (internal/modules/cjs/loader.js:1063:30) >> at Object.Module._extensions..js >> (internal/modules/cjs/loader.js:1092:10) >> at Module.load (internal/modules/cjs/loader.js:928:32) >> at Function.Module._load (internal/modules/cjs/loader.js:769:14) >> at abort >> (/Users/me/Desktop/gp/gp-process-api/gp-process-api/src/production/gp-process-api/dist/app/util/hello.js:1619:13) >> at assert >> (/Users/me/Desktop/gp/gp-process-api/gp-process-api/src/production/gp-process-api/dist/app/util/hello.js:856:9) >> at Object._addc >> (/Users/me/Desktop/gp/gp-process-api/gp-process-api/src/production/gp-process-api/dist/app/util/hello.js:1671:9) >> at Object.<anonymous> >> (/Users/me/Desktop/gp/gp-process-api/gp-process-api/src/production/gp-process-api/dist/app.js:59:29) >> at Module._compile (internal/modules/cjs/loader.js:1063:30) >> at Object.Module._extensions..js >> (internal/modules/cjs/loader.js:1092:10) >> at Module.load (internal/modules/cjs/loader.js:928:32) >> at Function.Module._load (internal/modules/cjs/loader.js:769:14) >> at Module.require (internal/modules/cjs/loader.js:952:19) >> at require (internal/modules/cjs/helpers.js:88:18) >> error Command failed with exit code 7. >> info Visit https://yarnpkg.com/en/docs/cli/run for documentation about >> this command. >> $ >> >> >> On Wednesday, April 14, 2021 at 1:21:57 PM UTC-7 HJ wrote: >> >>> Thank you both for the quick responses. >>> Floh, I will try this today. >>> Geoffrey, I have tried your Generate Javascript Using MATLAB Coder >>> add-on in MATLAB, but ran into issues. I posted those issues on the >>> conversation that is on that add-on's page. >>> >>> On Wednesday, April 14, 2021 at 5:13:16 AM UTC-7 [email protected] >>> wrote: >>> >>>> Hello, >>>> You may want to look at: >>>> >>>> https://www.mathworks.com/matlabcentral/fileexchange/69973-generate-javascript-using-matlab-coder >>>> There is an update to be released soon that will resolve the issues >>>> shown in the discussion. The existing add-on should work so long as you >>>> install emscripten using the following flag: >>>> >>>> ./emsdk install 1.38.45 >>>> >>>> Hope this helps. >>>> On Wednesday, April 14, 2021 at 7:43:02 AM UTC-4 Floh wrote: >>>> >>>>> Hi, I quickly cobbled together a "simplest possible sample" for >>>>> calling a C function from JS here: >>>>> >>>>> https://github.com/floooh/emsc-interop-demo >>>>> >>>>> This is running in the browser though and it's a bit quick'n'dirty, >>>>> but it should get you started at least >>>>> for your own experimentations. The important things are the >>>>> EMSCRIPTEN_KEEPALIVE annotation in the >>>>> hello.c file, and the underscore in front of the addc() function call >>>>> in Javascript in shell.html. >>>>> >>>>> If you cannot annotate the original source files with >>>>> EMSCRIPTEN_KEEPALIVE, you can also provide the >>>>> C functions names to make visible to Javascript with a compiler option >>>>> instead, see here: >>>>> >>>>> >>>>> https://emscripten.org/docs/getting_started/FAQ.html#why-do-functions-in-my-c-c-source-code-vanish-when-i-compile-to-javascript-and-or-i-get-no-functions-to-process >>>>> >>>>> I prefer to work with simple C-APIs instead of C++ APIs, because with >>>>> C-APIs you >>>>> can (more or less) call the functions directly from Javascript instead >>>>> of creating a "language binding" >>>>> between C++ and Javascript interfaces. For this, emscripten has a tool >>>>> called "embind" (which adds a whole >>>>> new level of complexity and more things that can break, but I guess >>>>> that's personal opinion heh). >>>>> There are some caveats with non-trivial function arguments (for >>>>> instance pointers to data on the WASM heap), >>>>> maybe embind makes this case easier, don't know. >>>>> >>>>> In any case, here's the embind documentation: >>>>> >>>>> >>>>> https://emscripten.org/docs/porting/connecting_cpp_and_javascript/embind.html >>>>> >>>>> Hope this helps! >>>>> >>>>> On Wednesday, 14 April 2021 at 02:43:49 UTC+2 HJ wrote: >>>>> >>>>>> I am a beginner and I'm sure all the information is there, but I am >>>>>> struggling to get even a basic example working. I can run the tutorial >>>>>> example, but I can't get anything for the following: >>>>>> >>>>>> I have converted some MATLAB .m script files to C (MATLAB can convert >>>>>> to C or CPP. I've tried both C and CPP in the below information.) >>>>>> >>>>>> MATLAB has 1 function per 1 file, so now I have two .c files with one >>>>>> c function in each. >>>>>> >>>>>> I've run emcc to convert .c to .js >>>>>> When I look in the a.out.js and search for "myfunct", all I see for >>>>>> my function is the following and I'm not sure how to call it in my js >>>>>> main >>>>>> program: >>>>>> >>>>>> /** @type {function(...*):?} */ var _myFunc = Module["_myFunc"] = >>>>>> createExportWrapper("myFunc"); >>>>>> >>>>>> I've played around with many different command line parameters that >>>>>> I've found on various Q&A forums, but still can't figure out how to >>>>>> create >>>>>> such that there is a function called "myFunc" that I can call from my >>>>>> other >>>>>> js files (actually typescript, but just assume js for this.) >>>>>> >>>>>> This code will be run on the server side, node.js, and not on a >>>>>> browser. Backend code that will call these converted MATLAB functions to >>>>>> generate data. >>>>>> >>>>>> It would be nice to have an example from beginning to end (I've been >>>>>> searching and searching, but I only find answers that will say things >>>>>> like, >>>>>> "You just need to use the xxxx option", but there is more to the puzzle >>>>>> that I am missing. >>>>>> >>>>>> It seems like the examples on emscripten site are all self contained: >>>>>> you build and run them, but no example of how to convert a function and >>>>>> how >>>>>> to integrate it (call it) from other js code. I have read the many >>>>>> options, >>>>>> but again I am not sure exactly what to do. I've also read the comments >>>>>> in >>>>>> the produced js file about creating a module and searched, but I am not >>>>>> sure how to define a module for a function. >>>>>> >>>>>> - What are the emcc parameters do I use? >>>>>> - Can I convert just this one function or do I need to have a >>>>>> main() that calls it? >>>>>> - Once converted, it looks like I need to define a module for >>>>>> "myfunc", but I am not sure how it is defined, when to define, do I >>>>>> add >>>>>> after into the .js? >>>>>> - What about using the WASM=0 option to only produce js and no >>>>>> WASM. Maybe that is a route to take? (I tried and it produced some >>>>>> different code in .js, but i'm still stuck on what to do with it. >>>>>> >>>>>> I created the below simple function that takes a double and returns a >>>>>> double for trying this. If anyone can show me the steps with this or any >>>>>> HelloWorld that takes a parameter and returns it would be greatly >>>>>> appreciated. (or even more complex example.) >>>>>> >>>>>> Thank helping this newbie! :-) >>>>>> >>>>>> *myFunc.c:* >>>>>> >>>>>> #include "myfunc.h" >>>>>> double myfunc(double myInt) { >>>>>> return myInt + 50.0; >>>>>> } >>>>>> >>>>>> *myFunc.h:* >>>>>> >>>>>> #ifndef MYFUNC_H >>>>>> #define MYFUNC_H >>>>>> >>>>>> /* Include Files */ >>>>>> #include "rtwtypes.h" >>>>>> #include <stddef.h> >>>>>> #include <stdlib.h> >>>>>> >>>>>> #ifdef __cplusplus >>>>>> extern "C" { >>>>>> #endif >>>>>> >>>>>> /* Function Declarations */ >>>>>> extern double myFunc(double myInt); >>>>>> >>>>>> #ifdef __cplusplus >>>>>> } >>>>>> #endif >>>>>> >>>>>> #endif >>>>>> >>>>> -- > You received this message because you are subscribed to a topic in the > Google Groups "emscripten-discuss" group. > To unsubscribe from this topic, visit > https://groups.google.com/d/topic/emscripten-discuss/AwqiKUQNGYU/unsubscribe > . > To unsubscribe from this group and all its topics, send an email to > [email protected]. > To view this discussion on the web visit > https://groups.google.com/d/msgid/emscripten-discuss/9551b416-01da-4405-8a46-b600059fa337n%40googlegroups.com > <https://groups.google.com/d/msgid/emscripten-discuss/9551b416-01da-4405-8a46-b600059fa337n%40googlegroups.com?utm_medium=email&utm_source=footer> > . > -- You received this message because you are subscribed to the Google Groups "emscripten-discuss" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/emscripten-discuss/CAL2yYaD-2YoLH7VHa8h%2B%2BEhiBOdiLceejNOnxNuqfJ9zQXwn3Q%40mail.gmail.com.
