Android PJSip帐户注册

Android PJSip帐户注册,android,pjsip,Android,Pjsip,我正在尝试将PJSip添加到我正在进行的项目中。我有这个方法来注册我的帐户,但是每次都会发生“致命信号11”错误 这里是方法 public int setRegistration() { int status = pjsuaConstants.PJ_FALSE; /* Register to SIP server by creating SIP account. */ int[] accId = new int[1]; accId[0] = 1; Str

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

这里是方法

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
从未成功。它之所以成功,是因为它给了我这个错误

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},
编辑2

因此,在完成这项工作之后,我感到非常沮丧。我没有看到我做错了什么,所以我会把我的整个过程放在这里,看看有没有人有什么建议

  • 我首先获取pjsip库:
    svncohttp://svn.pjsip.org/repos/pjproject/trunk PJ项目
  • 运行`./configure--prefix=/usr/local
  • makedep&make
  • sudo制作安装

  • 然后我得到pjjni代码
    svn签出svn://svn.code.sf.net/p/pjsip-jni/code/ pjsip jni代码

  • 我遵循Makefile的说明
  • 在Makefile成功运行之后(在一些代码清理之后),我有2个.so文件(libpjsua_jni.so和libpjsua_jni_x64.so)
  • 使用Android.mk文件和.so库创建jni文件夹
  • 运行ndk生成()
  • 添加到ADT
  • 关闭项目。将本机支持从Java更改为Android。开放项目 ()
  • 将该项目添加到我的TestPJ项目(
    Android->Library->Add
  • 调用
    System.loadLibrary(“pjsualib”)
    ——新库的名称
  • 接收错误

    11-22 13:55:44.784:W/dalvikvm(11464):未找到本机Lorg/pjsip/pjsua/pjsuaJNI;的实现;。开关模块初始化:()V 11-22 13:55:48.792:W/dalvikvm(11464):异常Ljava/lang/unsatifiedlinkerror;初始化Lorg/pjsip/pjsua/pjsuaJNI时抛出; 11-22 13:55:51.417:E/AndroidRuntime(11464):java.lang.unsatifiedLinkError:未找到本机方法:org.pjsip.pjsua.pjsuaJNI.swig_module_init:()V 11-22 13:55:51.417:E/AndroidRuntime(11464):位于org.pjsip.pjsua.pjsuaJNI.swig_module_init(本机方法) 11-22 13:55:51.417:E/AndroidRuntime(11464):位于org.pjsip.pjsua.pjsuaJNI.(pjsuaJNI.java:1450)


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

    可以找到一个从Java和C探索JNI调用的项目示例。
    问题中提到的错误(java.lang.unsatifiedLinkError:Native method not found: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文档中找到(如果您使用的是android 4.4,请参阅Java 7)。

    -错误的java方法名/签名/类名或包名。这种情况与第一种情况几乎相反。同样,根据前面提到的错误,方法的名称必须是“init”,类名pjsuaJNI和包org.pjsip.pjsua。如果其中至少有一个错误,则会发生上述异常。签名或参数也必须正确。在这个错误的边界中,它可以被视为方法的一个参数(此外,还会出现本机JNIEnv*和jobject)。因此,如有必要,也必须进行检查和修复。
    在从本机代码调用java的情况下,签名可以被视为java方法的表示形式,参数为字符串,可以通过应用于java*.class文件的javap-s*.class命令来查看。在问题的最后一条警告中,可以看到该方法的签名。

    另外,要使用方法pjsip库,必须在Java类的某个静态部分中加载。


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

    有点晚,但我会尽力帮助解决这个问题。我认为您的问题应该与您的本机方法无关,而不是被代码“>外”“C”{} /代码>和C++中的名字限制所包围。p>

    如果您不声明一个原生C函数为“代码>外”“C”<代码>,则C++构建Mangle,JNI机制无法找到提供签名的本机方法匹配。另一方面,将其声明为外部C函数,构建器将创建两个版本,即损坏版本和未管理版本,JNI可以找到合适的版本


    希望这有帮助

    您的SIPServer(常量或变量)设置在哪里?价值是什么。用户名设置在哪里?当前值是多少?它们在saveUserInfo方法中设置。这将被调用,并且正在填充值。我不认为有必要提供我的服务器和用户名信息。你不必给我这些信息,但你必须确保在到达该行时它们不为空。从我看到的错误来看,这两个变量可能为空。您可以尝试在此处设置断点