Ошибка вызова метода в NPObject! в Android 2.2
Я использую addJavascriptInterface в своем приложении для Android, чтобы позволить JavaScript вызывать функции, созданные мной в моем родном Java-приложении.
Это хорошо работает в Android 2.1, однако в Android 2.2 я получаю сообщение об ошибке "Метод вызова ошибок в NPObject!"
Когда я обрабатываю вызов метода, вызывается внутренность метода native, но исключение генерируется в JavaScript.
Ответы
Ответ 1
Я получал эту точную ошибку:
Uncaught Error: Error calling method on NPObject!
Оказывается, я пытался вызвать функцию JavascriptInterface из веб-представления следующим образом:
AndroidJS.populateField(field);
а на стороне Java функция не приняла параметр:
public void populateField() {}
Просто позволяя функции Java принимать параметр, разрешив эту ошибку для меня.
например.,
public void populateField(String field) {}
Это может быть не так, и, вероятно, это не единственная причина, по которой эта ошибка может быть вызвана. Это просто, как я решил свой конкретный сценарий. Надеюсь это поможет!:)
Ответ 2
По моему опыту эта проблема вызвана интерфейсами 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.
Ответ 3
Хорошо, у меня такая же проблема, как и сегодня.
Что я сделал - это помещать код в поток пользовательского интерфейса, например, код ниже:
/**
* 給網頁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;
}
Это решило мою проблему и надеюсь, что это может помочь некоторому телу...: -)
Ответ 4
Вот трюк, который я нашел по этой проблеме, которая может быть полезна для некоторых людей, сталкивающихся с этой проблемой (и это, вероятно, объясняет прерывистые сбои, которые, похоже, не поддаются объяснению)...
Если какие-либо исключения выбрасываются (и не пойманы) в коде обработчика возврата до того, как обратный вызов интерфейса JavaScript будет возвращен в исходное состояние, он будет распространяться обратно как неудачный вызов, и вы также получите эту ошибку - и ничего не получится делать с отсутствующими функциями или параметрами.
Самый простой способ найти этот случай (независимо от того, используете ли вы его в своей последней реализации) - это толкать любой код обработчика, который у вас есть обратно на поток пользовательского интерфейса (обратный вызов не будет в потоке пользовательского интерфейса) - это позволит обратный вызов для возврата в чистоту и любые последующие исключения, которые происходят, будут правильно распространяться до тех пор, пока вы их не поймаете или пока приложение не выйдет из строя. В любом случае вы точно увидите, что происходит на самом деле. В противном случае неперехваченное исключение переходит к javascript, где он не будет обрабатываться или не сообщаться каким-либо образом (если только вы специально не создали код захвата ошибок в JS, который вы выполняли).
Удачи всем.
ЬН
Ответ 5
У меня была та же проблема с интерфейсом Javascript-to-Java (WebView.addJavascriptInterface
).
В Android 2.1 все работало отлично, но в Android 2.2 Javascript не смог вызвать методы из этого интерфейса. Он возвратил ошибку: Uncaught Error: Error calling method on NPObject!
Похоже, что на Android 2.2 у WebView возникла проблема с типом данных Boolean, возвращаемым из функций интерфейса.
Изменение:
public Boolean test_func() { return true; }
... to:
public int test_func() { return 1; }
... решил проблему.
Ответ 6
Это, я считаю, больше не поддерживается (всегда ошибка NPObject игры).
См. Ответ в этой теме
Посетите чтобы открыть мероприятие от CordovaPlugin