Ошибка вызова метода в NPObject! в Android 2.2 - PullRequest
11 голосов
/ 27 июля 2010

Я использую addJavascriptInterface в своем приложении Android, чтобы позволить JavaScript вызывать функции, которые я создал в своем родном приложении Java.

Это хорошо работало в Android 2.1, однако в Android 2.2 я получаю сообщение об ошибке«Ошибка вызова метода в NPObject!»

Когда я инструментирую вызов метода, вызывается внутреннее содержимое нативного метода, однако в JavaScript генерируется исключение.

Ответы [ 6 ]

11 голосов
/ 18 мая 2012

Я получил эту точную ошибку:

Uncaught Error: Error calling method on NPObject!

Оказывается, я пытался вызвать функцию JavascriptInterface из веб-просмотра следующим образом:

AndroidJS.populateField(field);

и на стороне Java функция не приняла параметр:

public void populateField() {}

Простое разрешение функции Java на принятие параметра решило эту ошибку для меня.

Например, public void populateField(String field) {}

Возможно, это не единственная причина, по которой может быть выдана эта ошибка.Это просто, как я решил свой конкретный сценарий.Надеюсь это поможет!:)

5 голосов
/ 23 мая 2013

ОК, у меня та же проблема, только сегодня.

Что я сделал, так это поместил код в поток пользовательского интерфейса, как показано ниже:

/**
 * 給網頁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;
}

Это решило мою проблему, и надеюсь, что это может помочь некоторому телу ...: -)

5 голосов
/ 04 января 2012

По моему опыту, эта проблема вызвана интерфейсами Javascript, возвращающими объекты, которые Javascript не идентифицирует автоматически.

В Android это вызвано оболочками типа Boolean или Long по сравнению с их родными версиями логическое и long .

//This will fail
public Long getmyLongVal() {
    return 123456789;
}

//This will work
public long getMyNativeLongVal() {
    return 123456789;
}

Поэтому удалите классы-оболочки для любых методов, используемых Javascript, если вы хотитеизбегать ошибок NPObject.

2 голосов
/ 30 мая 2013

Вот поворот, который я нашел по этой проблеме, который может быть полезен для некоторых людей, сталкивающихся с этой проблемой (и он, вероятно, объясняет периодические сбои, которые, кажется, не поддаются объяснению) ...

Если какие-либо исключенияБрошенный (и не перехваченный) в код обработчика возврата перед тем, как разрешить обратный вызов интерфейса javascript для возврата в чистое состояние, он будет распространяться обратно как неудачный вызов, и вы также получите эту ошибку - и это не будет иметь ничего общего с отсутствующими функциями или параметрами.

Самый простой способ найти этот случай (независимо от того, используете ли вы это в своей окончательной реализации) - это вставить любой код обработчика, который у вас есть, обратно в поток пользовательского интерфейса (обратный вызов не будет в потоке пользовательского интерфейса).- это позволит обратному вызову вернуть чистый, и любые последующие исключения будут правильно распространяться до тех пор, пока вы их не поймаете или пока приложение не выйдет из строя.В любом случае вы увидите, что именно происходит на самом деле.В противном случае необработанное исключение передается обратно в javascript, где оно не будет обработано или сообщено каким-либо образом (если только вы специально не встроили код перехвата ошибок в JS, который выполняли).

Удачи всем.

ЧД

1 голос
/ 25 июля 2011

У меня была такая же проблема с интерфейсом 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; }

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

0 голосов
/ 09 мая 2013

Я считаю, что это больше не поддерживается (всегда ошибка игры NPObject).Пожалуйста, обратитесь к ответу в этой теме Посетите открыть деятельность с CordovaPlugin

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...