Ошибка вызова метода в 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; }

... решил проблему.