Ошибка вызова метода в NPObject! В Android 2.2

Я использую 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