Я использую addJavascriptInterface в своем приложении для Android, чтобы позволить JavaScript вызывать функции, созданные мной в моем родном Java-приложении.
Это хорошо работало в Android 2.1, однако в Android 2.2 я получил сообщение об ошибке «Метод вызова ошибок в NPObject!»
Когда я обрабатываю вызов метода, внутренняя обработка нативного метода вызывается, однако исключение бросает JavaScript.
Я получал эту точную ошибку:
Uncaught Error: Error calling method on NPObject!
Оказывается, я пытался вызвать функцию JavascriptInterface из веб-представления следующим образом:
AndroidJS.populateField(field);
И на стороне Java функция не принимала параметр:
public void populateField() {}
Просто позволяя функции Java принимать параметр, решила эту ошибку для меня.
Например, public void populateField(String field) {}
Возможно, это не так, и, вероятно, это не единственная причина, по которой эта ошибка может быть вызвана. Это просто, как я решил свой конкретный сценарий. Надеюсь это поможет! 🙂
По моему опыту эта проблема вызвана интерфейсами Javascript, возвращающими объекты, которые Javascript автоматически не идентифицирует.
В Android это вызвано оболочками типа Boolean или Long по сравнению с их родными версиями boolean и long .
//This will fail public Long getmyLongVal() { return 123456789; } //This will work public long getMyNativeLongVal() { return 123456789; }
Поэтому удалите классы-оболочки для любых методов, используемых Javascript, если вы хотите избежать ошибок NPObject.
Хорошо, у меня такая же проблема, как и сегодня.
Что я сделал – это помещать код в поток пользовательского интерфейса, например, код ниже:
/** * 給網頁Javascript呼叫的method * Method for Javascript in HTML * @param java.lang.String - Playlist ID */ public int callListByPID(final String pId) { Log.i(Constants.TAG, "PAD Playlist ID from HTML: "+pId); runOnUiThread(new Runnable() { public void run() { // Put your code here... } }); return 1; }
Это решило мою проблему и надеюсь, что это может помочь некоторому телу … 🙂
Вот трюк, который я нашел по этой проблеме, которая может быть полезна для некоторых людей, сталкивающихся с этой проблемой (и это, вероятно, объясняет прерывистые сбои, которые, похоже, не дают объяснений) …
Если какие-либо исключения бросаются (и не пойманы) в коде обработчика возврата до того, как обратный вызов интерфейса javascript возвратится в чистоту, он будет распространяться обратно как неудачный вызов, и вы также получите эту ошибку – и это не будет иметь никакого отношения к Отсутствующие функции или параметры.
Самый простой способ найти этот случай (независимо от того, используете ли вы его в своей окончательной реализации) – это толкать любой код обработчика, который у вас есть обратно в поток пользовательского интерфейса (обратный вызов не будет в потоке пользовательского интерфейса) – это позволит обратный вызов Return clean и любые последующие исключения, которые происходят, будут правильно распространяться до тех пор, пока вы их не поймаете или пока приложение не выйдет из строя. В любом случае вы точно увидите, что происходит на самом деле. В противном случае неперехваченное исключение переходит к javascript, где он не будет обрабатываться или не сообщаться каким-либо образом (если вы специально не создали код захвата ошибок в JS, который вы выполняли).
Всем удачи.
ЬН
У меня была та же проблема с интерфейсом Javascript-to-Java ( WebView.addJavascriptInterface
).
В Android 2.1 все работало отлично, но в Android 2.2 Javascript не смог вызвать методы из этого интерфейса. Он возвратил ошибку: « Uncaught Error: Error calling method on NPObject!
Похоже, что на Android 2.2 у WebView возникла проблема с булевым типом данных, возвращаемым из функций интерфейса.
Изменение:
public Boolean test_func() { return true; }
… для:
public int test_func() { return 1; }
… решила проблему.
Это, я считаю, больше не поддерживается (всегда ошибка NPObject игры). Пожалуйста, обратитесь к ответу в этой теме. Посетите мероприятие от CordovaPlugin