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 gmcv...@gmail.com 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 the Google Groups "emscripten-discuss" group. To unsubscribe from this group and stop receiving emails from it, send an email to emscripten-discuss+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/emscripten-discuss/1722a215-5822-4afb-957f-c8eb1ab8f6e1n%40googlegroups.com.