Hi Alon,

thanks for answering. Sorry, it has been a while since I attacked this 
problem.
Now, I give it another try.

So, please let me explain my concrete problem:

My concrete problem is that a language unlike C/C++ or any other language 
that can be compiled via Emscripten, in particular that language is Java, 
uses a mechanism called "Java Native Interface" to declare and link to 
native functions at runtime.
Concretely those native functions are themselves implemented in C in the 
gnu classpath library and are compiled and archived via Emscripten into .a 
files.
This process works perfectly with Emscripten!
But, the process of invoking that function is not from C and does not have 
function prototypes/signatures to compile against.
The Java Virtual Machine, while interpreting the Java bytecode files, sees 
that a "native" method is about to be invoked.
Then, it looks up the pointer to the corresponding native function 
(question: "how do I lookup a native function dynamically with Emscripten 
at runtime without using dlsym and all the dynamic library features?").
After the native function was found, the arguments are being put on the C 
stack via some mechanism (in a desktop JRE this is done via x86 assembly 
code or the libffi), and then the function is called through the function 
pointer.
Now, my question is concretely: How would I achieve this? I know how to 
link everything in a static library, as one should do that with Emscripten. 
But now I do not know how to lookup the pointer to a function in the 
process and how to pass arguments from C to its JavaScript "native" 
function.

Thanks!
Kai

Am Montag, 4. Mai 2015 21:45:31 UTC+2 schrieb Alon Zakai:
>
> Maybe I wasn't understanding you before. A concrete code sample might help.
>
> - Alon
>
>
> On Thu, Apr 30, 2015 at 2:13 PM, <[email protected] <javascript:>> 
> wrote:
>
>> Thank you for your answer!
>>
>> Although I am totally not getting anything from that 19 lines of test 
>> case and how anything is supposed to work with that, let alone what that 
>> test case is actually doing. Looks very cryptic to me. :)
>> But if you say it's gonna work this way, then I will try further.
>>
>> I just don't know how it can be possible to invoke a function whose 
>> signature I cannot express in C code at compile time with a prototype, 
>> since the actual signature is encoded via some other mechanism as a string 
>> that I can query at runtime, such as "(II)V", meaning "take two integers 
>> and return void".
>>
>> And I don't know how to put arguments from the emscripten HEAP on the C 
>> stack and call that function then.
>>
>> dlfnc symbols seem to be needing a compile-time function prototype to 
>> cast against before invoking the function.
>> But I don't have that. And I think that's also the problem that libffi is 
>> solving with all that assembler magic, because one has no function 
>> prototype/signature at compile time.
>>
>> So the original question was whether it would then make more sense to 
>> generate asm.js code during runtime which is able to decode the signature 
>> string (i.e. the "(II)V") of the function into a real JavaScript function 
>> invocation.
>>
>> Thanks again!
>>
>> Am Samstag, 25. April 2015 10:26:53 UTC+2 schrieb [email protected]:
>>>
>>> Hi there,
>>>
>>> I was wondering what would be a possible solution to dynamically call an 
>>> Emscripten-compiled function within the same application (no dynamic 
>>> library).
>>> The issue is that during compile-time I do not know the target 
>>> function's signature and therefore do not have static C caller code that 
>>> could invoke the required function, but must instead build such code during 
>>> runtime.
>>>
>>> For native languages there exists libffi for exactly this purpose and it 
>>> is using assembler code to put function arguments on the stack.
>>> I was wondering what the best approach with emscripten is to link a 
>>> dynamic function call to its target function.
>>> The information I have at a possible caller-site is: (function name, 
>>> function signature, base stack pointer on the heap of the first argument).
>>> I was thinking about dynamically building a small asm.js module which 
>>> reads the arguments from the heap starting at the base pointer and which 
>>> then builds an appropriate function call.
>>> This script I would then eval() in order to get an asm.js-compiled 
>>> libffi-like interface.
>>>
>>> Would this be a viable approach?
>>>
>>> Thanks!
>>>
>>> Kind regards,
>>> Kai
>>>
>> -- 
>> 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] <javascript:>.
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>

-- 
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].
For more options, visit https://groups.google.com/d/optout.

Reply via email to