2013-10-10 6 views
6

Я пытаюсь добавить PJSip к проекту, над которым я работаю. У меня есть этот метод для регистрации моей учетной записи, но ошибка «Fatal signal 11» возникает каждый раз.Регистрация учетной записи PJSip

Вот метод

public int setRegistration() { 
    int status = pjsuaConstants.PJ_FALSE; 
    /* Register to SIP server by creating SIP account. */ 
    int[] accId = new int[1]; 
    accId[0] = 1; 

    String uName = getUserName(); 
    String passwd = getPassword(); 
    String server = getSIPServer(); 

    pjsua_acc_config acc_cfg = new pjsua_acc_config(); 
    pjsua.acc_config_default(acc_cfg); 

    acc_cfg.setId(pjsua.pj_str_copy("sip:" + uName + "@" + server)); 
    acc_cfg.setReg_uri(pjsua.pj_str_copy("sip:" + server)); 
    acc_cfg.setCred_count(1); 

    acc_cfg.getCred_info().setRealm(pjsua.pj_str_copy(server)); 
    acc_cfg.getCred_info().setScheme(pjsua.pj_str_copy("digest")); 
    acc_cfg.getCred_info().setUsername(pjsua.pj_str_copy(uName)); 
    acc_cfg.getCred_info().setData_type(pjsip_cred_data_type.PJSIP_CRED_DATA_PLAIN_PASSWD.swigValue()); 
    acc_cfg.getCred_info().setData(pjsua.pj_str_copy(passwd)); 

    Log.d("status", "acc is adding.."); 
    status = pjsua.acc_add(acc_cfg, pjsuaConstants.PJ_TRUE, accId); 
    Log.d("status", "acc is added"); 

    if (status == pjsuaConstants.PJ_SUCCESS) { 
     status = pjsua.acc_set_online_status(accId[0], 1); 
     Log.d("acc_set_online_status returned stauts=", String.valueOf(status)); 
    } else { 
     Log.d("Error status=", String.valueOf(status)); 
    } 
    return status; 
} 

Я получаю ошибку на status = pjsua.acc_add(acc_cfg, pjsuaConstants.PJ_TRUE, accId); линии. Я знаю, что имя пользователя, сервер и пароль не равны нулю. Я рассмотрел несколько вопросов, связанных с этим и не использую.

Как я могу зарегистрировать свой аккаунт?

Благодаря

***** ****** EDIT После отслеживания этого через блоги и форумы, я получил эту ошибку прошел, но получил другой. Причина возникновения этой ошибки состояла в том, что pjsua_init никогда не был успешным. Он был успешным, потому что он дал мне эту ошибку

11-04 10:19:20.973: E/AndroidRuntime(2961): FATAL EXCEPTION: main 
11-04 10:19:20.973: E/AndroidRuntime(2961): java.lang.UnsatisfiedLinkError: Native method not found: org.pjsip.pjsua.pjsuaJNI.init:(JLorg/pjsip/pjsua/pjsua_config;JLorg/pjsip/pjsua/pjsua_logging_config;JLorg/pjsip/pjsua/pjsua_media_config;)I 
11-04 10:19:20.973: E/AndroidRuntime(2961):  at org.pjsip.pjsua.pjsuaJNI.init(Native Method) 
11-04 10:19:20.973: E/AndroidRuntime(2961):  at org.pjsip.pjsua.pjsua.init(pjsua.java:812) 

Я получил это предупреждение, а

No implementation found for native Lorg/pjsip/pjsua/pjsuaJNI;.init (JLorg/pjsip/pjsua/pjsua_config;JLorg/pjsip/pjsua/pjsua_logging_config;JLorg/pjsip/pjsua/pjsua_media_config;)I 

Почему не это нативный метод? Я просматриваю библиотеки, которые я назвал, но кроме этого не знаю, почему это не работает.

Любая помощь по этому вопросу была бы замечательной. Благодаря

PJ Код

pjsua.java

public synchronized static int init(pjsua_config ua_cfg, pjsua_logging_config log_cfg, pjsua_media_config media_cfg) { 
    return pjsuaJNI.init(pjsua_config.getCPtr(ua_cfg), ua_cfg, pjsua_logging_config.getCPtr(log_cfg), log_cfg, pjsua_media_config.getCPtr(media_cfg), media_cfg); 
} 

pjsuaJNI.java

public final static native int init(long jarg1, pjsua_config jarg1_, long jarg2, pjsua_logging_config jarg2_, long jarg3, pjsua_media_config jarg3_); 

pjsua_wrap.cpp

SWIGEXPORT jint JNICALL Java_org_pjsip_pjsua_pjsuaJNI_init(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2, jobject jarg2_, jlong jarg3, jobject jarg3_) { 
    jint jresult = 0 ; 
    pjsua_config *arg1 = (pjsua_config *) 0 ; 
    pjsua_logging_config *arg2 = (pjsua_logging_config *) 0 ; 
    pjsua_media_config *arg3 = (pjsua_media_config *) 0 ; 
    pj_status_t result; 

    (void)jenv; 
    (void)jcls; 
    (void)jarg1_; 
    (void)jarg2_; 
    (void)jarg3_; 
    arg1 = *(pjsua_config **)&jarg1; 
    arg2 = *(pjsua_logging_config **)&jarg2; 
    arg3 = *(pjsua_media_config **)&jarg3; 

    result = (pj_status_t)pjsua_init((pjsua_config const *)arg1,(pjsua_logging_config const *)arg2,(pjsua_media_config const *)arg3); 
    jresult = (jint)result; 
    return jresult; 
} 

{"init", "(JLorg/pjsip/pjsua/pjsua_config;JLorg/pjsip/pjsua/pjsua_logging_config;JLorg/pjsip/pjsua/pjsua_media_config;)I", (void*)& Java_org_pjsip_pjsua_pjsuaJNI_init}, 

EDIT 2

Итак, после работы над этим я дошел до разочарования. Я не вижу, что я делаю неправильно, поэтому я поставлю весь свой процесс здесь, чтобы узнать, есть ли у кого-то предложение.

  1. Я начинаю получать библиотеку pjsip: svn co http://svn.pjsip.org/repos/pjproject/trunk pjproject
  2. запустить `./configure prefix =/USR/местные
  3. делают отд & сделать
  4. Sudo сделать установку

  5. Затем я получаю код pjjni svn checkout svn://svn.code.sf.net/p/pjsip-jni/code/ pjsip-jni-code

  6. Я следую инструкциям Makefile
  7. После того, как Makefile успешно работает (после некоторой очистки кода) У меня есть 2 .so-файла (libpjsua_jni.so и libpjsua_jni_x64.so)
  8. Создайте jni-папку с файлом Android.mk и.поэтому библиотеки
  9. Run NDK-сборка (How to load another .so file in your android project?)
  10. Добавить в ADT
  11. Закрыть проект. Измените собственную поддержку с Java на Android. Открытый проект (Convert existing project into Android project in Eclipse?)
  12. Добавим, что проект моего TestPJ проекта (Android -> Library -> Add)
  13. Вызов System.loadLibrary("pjsualib") - имя нового lib.so
  14. ошибок приема

    11-22 13:55: 44.784: W/dalvikvm (11464): Не найдено реализации для родного Lorg/pjsip/pjsua/pjsuaJNI; .swig_module_init :() V 11-22 13: 55: 48.792: W/dalvikvm (11464): Исключение Ljava/lang/UnsatisfiedLinkError; бросается при инициализации Lorg/pjsip/pjsua/pjsuaJNI; 11-22 13: 55: 51.417: E/AndroidRuntime (11464): java.lang.UnsatisfiedLinkError: родной метод не найден: org.pjsip.pjsua.pjsuaJNI.swig_module_init :() V 11-22 13: 55: 51.417 : E/AndroidRuntime (11464): at org.pjsip.pjsua.pjsuaJNI.swig_module_init (собственный метод) 11-22 13: 55: 51.417: E/AndroidRuntime (11464): at org.pjsip.pjsua.pjsuaJNI. (PjsuaJNI .java: 1450)

Любая помощь будет замечательной. Благодаря!

+0

где ваш SIPServer, постоянный или переменный, установлен? какова ценность. где задано имя пользователя и каково текущее значение? – alinoz

+0

Они установлены в методе saveUserInfo. Это вызвано, и значения заполняются. Я не вижу необходимости указывать информацию о моем сервере и имени пользователя – BigT

+0

, вам не нужно давать мне информацию, но вы должны убедиться, что они не являются нулевыми, когда вы достигаете этого линий. из ошибок, которые я вижу, возможно, что эти 2 переменные равны нулю. вы можете попытаться установить там точку останова и посмотреть, какие значения хранятся в переменных SIPServer и userName. – alinoz

ответ

3

Пример проекта, который исследует вызовы JNI с Java и с C, можно найти here.
Ошибка упомянуто в вопросе (java.lang.UnsatisfiedLinkError: Native метод не найден: org.pjsip.pjsua.pjsuaJNI) означает, что одна из следующих проблем:

- неправильно родное имя метода или/и его аргументы/возвращаемое значение. Если у вас есть доступ к собственному коду библиотеки, вы можете исправить это. В соответствии с сообщением об ошибке и соображениями JNI собственный метод должен иметь имя Java_org_pjsip_pjsua_pjsuaJNI_init (JNIEnv * env, jobject obj, ..), где env - указатель на интерфейс JVM, obj - это «этот» указатель, а остальные аргументы могут быть определены из java init метод класса pjsuaJNI пакета org.pjsip.pjsua. Простые типы параметров должны быть jint, jstring и т. Д. Также должно быть правильным и возвращаемое значение. Исправление всего этого позволяет использовать этот метод из класса pjsuaJNI. Дополнительные сведения можно найти в документации Oracle до Oracle Documentation to Java 6 JNI (или Java 7, если вы используете Android 4.4).

- неправильный метод java name/подпись/класс name или наименование упаковки. Этот случай почти обращен к первому. Опять же, в соответствии с указанным именем ошибки метод должен быть «init», имя класса pjsuaJNI и пакет org.pjsip.pjsua. Если хотя бы один из них ошибочен, указанное исключение произойдет. Подпись или параметры также должны быть правильными. В границах этой ошибки его можно рассматривать как параметры метода (кроме того, в нативном JNIEnv * и появляется задание). Поэтому также необходимо проверять и исправлять, если это необходимо.
В случае вызова из собственного кода в java-сигнатуру можно рассматривать как представление java-метода с параметрами в виде строки и его можно просмотреть с помощью команды javap -s * .class, примененной к java * .class-файлу. И в последнем предупреждении из вопроса можно увидеть эту сигнатуру метода.

Также для использования метода библиотека pjsip должна быть загружена System.loadLibrary() в каком-то статическом разделе класса Java.

К сожалению, эта проблема возникает во время выполнения (было бы неплохо, если бы это произошло во время компиляции).

+0

Я вполне уверен, что следил за всем, что вы сказали в своем ответе. Я добавил код выше, если я пропустил что-то, а кто-то еще его увидит. – BigT

+0

@BigT. Вы пытались сгенерировать заголовок C для pjsuaJNI.java с помощью утилиты javah и сравнить ее вывод с собственными функциями из pjsua_wrap.cpp? – Michael

+0

Как создать заголовок pjsuaJNI? – BigT

0

Немного поздно, но я постараюсь помочь в этом.Я думаю, что ваша проблема должна быть связана с вашим родным методом, не окруженным extern "C"{} и именем mangling в C++.

Если вы не объявляете одну нативную функцию C как extern "C", сборка C++ управляет им, а механизм JNI не может найти собственный метод, соответствующий предоставленной подписи. С другой стороны, объявляя его как внешнюю функцию C, создатель создает как измененные, так и неизменные версии, а JNI может найти правильный.

Надеюсь, это поможет.

Смежные вопросы