我正在尝试将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
因此,在做完这件事后,我感到很沮丧。我没有看到我做错了什么,所以我会把我的整个过程放在这里,看看是否有人有建议。
svn co http://svn.pjsip.org/repos/pjproject/trunk pjprojectsvn checkout svn://svn.code.sf.net/p/pjsip-jni/code/ pjsip-jni-code。Android -> Library -> Add)中System.loadLibrary("pjsualib") --新lib.so的名称任何帮助都会很好。谢谢!
发布于 2013-11-05 19:04:14
这里是一个项目的例子,它探索了来自Java和C的JNI调用。
问题中提到的错误(java.lang.UnsatisfiedLinkError:本机方法未找到: org.pjsip.pjsua.pjsuaJNI)表示以下问题之一:
此外,要使用方法,必须在Java类的某些静态部分中使用System.loadLibrary()加载pjsip库。
不幸的是,这个问题发生在运行时(如果它发生在编译期间,那就太好了)。
发布于 2013-11-15 21:15:48
现在有点晚了,但我会尽力帮忙的。我认为您的问题应该与您的本地方法有关,而不是被extern "C"{}和C++中的名称损坏所包围。
如果不将一个本机C函数声明为extern "C",则C++构建它会损坏它,而JNI机制无法找到与提供的签名相匹配的本机方法。另一方面,将其声明为外部C函数时,构建器会同时创建损坏和未处理的版本,版本和JNI可以找到合适的版本。
希望这能有所帮助。
https://stackoverflow.com/questions/19305777
复制相似问题