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 *

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.

Other Threads



When I'm looking over source code, I often find LOCAL_MODULE_TAGS. But
there's no definition about that.

Especially, I'm interested in the difference between
- eng
- user
- optional
- development

Could anyone teach me what each tag means?


Daisuke Miyakawa ()


2. What's the proper way to share data between lite and pro versions of the same app?

Don't specify the full path, just use Context.createPackageContext() to
create a Context for the other package, and then use the data access APIs
from there.

Absolute paths: bad bad bad.

On Mon, Apr 27, 2009 at 8:43 AM, Michael MacDonald <

Dianne Hackborn
Android framework engineer

Note: please don't send private questions to me, as I don't have time to
provide private support, and so won't reply to such e-mails.  All such
questions should be posted on public forums, where I and others can see and
answer them.


3. c++ on android

4. How to launch a standard application in adb shell

5. How to use Eclipse to debug x86 target?

6. Accessing a server through wifi

7. Issues with debugging using Ganymede Eclipse