Trouble using NPN_PluginThreadAsyncCall and NPN_InvokeDefault to call back the browser from a native thread

by juliancwl » Mon, 18 Jan 2010 04:27:00 GMT


Sponsored Links
 I am developing an NPAPI plugin to process browser script.  Platform
is a build of the 1.6 Android source on Ubuntu, target is the browser
on the emulator supplied with the SDK.

Some of the JavaScript functions are asynchronous, passing in success/
failure callback functions as parameters. These are to be called back
by us when an async process has completed.

To achieve this we use the following code:

browser->invokeDefault(NP context, NPObject* onSuccessCbObject,
NPVARIANT args[] , int numargs, NPVARIANT * retVal);

This works well when called in the main plugin thread - the script
runs in the browser as expected.

However we need to implement this as an asynchronous callback. Firstly
we tried spawning a new pThread to run the above code - which
invariably crashed the browser.

So I tried using the NPN_PluginThreadAsyncCall function which seems to
allow a worker thread to run a function in the main browser UI thread.
This is called as follows:

browser->pluginthreadasynccall(  void (*func)(void *) , void *
userData)

The function we pass to this API contains the call to invokeDefault as
described above. When this is called the browser crashes immediately
(signal 11).

I am sure that all data passed to the function is valid, and the
lifetime of objects passed between threads are protected by reference
counting to ensure nothing is deleted prematurely. remove the call to
invokeDefault from the thread function, and everything completes and
cleans up as expected. But as soon as invokeDefault is called the
program crashes straight away.

Any ideas what might be going on?  Is there something else I should be
doing, or a preferred way to implement callbacks to a browser.

Many thanks - Julian.