首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PJSip帐号注册

PJSip帐号注册
EN

Stack Overflow用户
提问于 2013-10-10 20:38:51
回答 2查看 4K关注 0票数 6

我正在尝试将PJSip添加到我正在进行的项目中。我有这个方法注册我的帐户,但‘致命信号11’错误每次都会发生。

这是一个方法

代码语言:javascript
复制
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);行上的错误。我知道用户名、服务器和密码都不是空的。我看过与此有关的多个问题,没有任何用处。

我如何登记我的帐户?

谢谢

*编辑*在通过博客和论坛跟踪这个错误后,我收到了这个错误,但是收到了另一个错误。发生此错误的原因是pjsua_init从未成功。它成功了,因为它给了我这个错误。

代码语言:javascript
复制
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)

我也收到了这个警告

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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},

编辑2

因此,在做完这件事后,我感到很沮丧。我没有看到我做错了什么,所以我会把我的整个过程放在这里,看看是否有人有建议。

  1. 我从获取pjsip库开始:svn co http://svn.pjsip.org/repos/pjproject/trunk pjproject
  2. 运行./配置-前缀=/usr/local
  3. 制造和制造
  4. sudo make安装
  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. 使用Android.mk文件和.so库创建jni文件夹
  9. 运行ndk-构建(如何在安卓项目中加载另一个.so文件?)
  10. 添加到ADT
  11. 结束项目。将本机支持从Java更改为Android。开放项目(在Eclipse中将现有项目转换为Android项目?)
  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:48.792: W/dalvikvm(11464):异常Ljava/lang/UnsatisfiedLinkError;初始化Lorg/pjsip/pjsua/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) 11-22 13:55:51.417: E/AndroidRuntime(11464):at org.pjsip.pjsua.pjsuaJNI.(pjsuaJNI.java:1450)

任何帮助都会很好。谢谢!

EN

回答 2

Stack Overflow用户

发布于 2013-11-05 19:04:14

这里是一个项目的例子,它探索了来自Java和C的JNI调用。

问题中提到的错误(java.lang.UnsatisfiedLinkError:本机方法未找到: org.pjsip.pjsua.pjsuaJNI)表示以下问题之一:

  • 错误的本机方法名称或/及其参数/返回值.,如果您能够访问库的本机代码,则无法修复它。根据错误消息和JNI考虑,本机方法必须具有名称Java_org_pjsip_pjsua_pjsuaJNI_init(JNIEnv * env,jobject obj,..),其中env是指向JVM接口的指针,obj是"this“指针,其余的参数可以从包org.pjsip.pjsua的pjsuaJNI类的java init方法中确定。简单的参数类型必须是jint、jstring等。返回值也必须是正确的。修复所有这些允许从pjsuaJNI类中使用此方法。其他细节可以从Oracle到Oracle文档到Java 6 JNI找到(如果您使用Android4.4,也可以找到Java7)。
  • 错误的java方法名称/签名/类名或包名。这种情况几乎与第一次完全相反。同样,根据上述方法的错误名称必须是"init“、类名pjsuaJNI和包org.pjsip.pjsua。如果其中至少有一个是错误的,则会发生上述异常。签名或参数也必须是正确的。在此错误的边界内,可以将其视为方法的参数(此外,在本机JNIEnv*和jobject中也会出现)。因此,如果有必要,也必须进行检查和修复。 在从本机代码调用java签名的情况下,可以将其视为参数为字符串的java方法的表示,并可以使用应用于java -s文件的javap *.class命令查看。在问题的最后一次警告中,可以看到这个方法的签名。

此外,要使用方法,必须在Java类的某些静态部分中使用System.loadLibrary()加载pjsip库。

不幸的是,这个问题发生在运行时(如果它发生在编译期间,那就太好了)。

票数 3
EN

Stack Overflow用户

发布于 2013-11-15 21:15:48

现在有点晚了,但我会尽力帮忙的。我认为您的问题应该与您的本地方法有关,而不是被extern "C"{}和C++中的名称损坏所包围。

如果不将一个本机C函数声明为extern "C",则C++构建它会损坏它,而JNI机制无法找到与提供的签名相匹配的本机方法。另一方面,将其声明为外部C函数时,构建器会同时创建损坏和未处理的版本,版本和JNI可以找到合适的版本。

希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19305777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档