Android PJSip帐户注册
我正在尝试将PJSip添加到我正在进行的项目中。我有这个方法来注册我的帐户,但是每次都会发生“致命信号11”错误 这里是方法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
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方法中设置。这将被调用,并且正在填充值。我不认为有必要提供我的服务器和用户名信息。你不必给我这些信息,但你必须确保在到达该行时它们不为空。从我看到的错误来看,这两个变量可能为空。您可以尝试在此处设置断点