6

作業中のプロジェクトに PJSip を追加しようとしています。この方法でアカウントを登録していますが、毎回「Fatal signal 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);。ユーザー名、サーバー、およびパスワードが null でないことはわかっています。これに関連する複数の質問を見てきましたが、役に立ちません。

どうすればアカウントを登録できますか?

ありがとう

*****編集***** ブログやフォーラムを通じてこれを追跡した後、このエラーは渡されましたが、別のエラーを受け取りました。このエラーが発生した理由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

だから、これに取り組んだ後、私はフラストレーションのポイントに達しました. 私は自分が間違っていることを見ていないので、プロセス全体をここに置いて、誰かが提案を持っているかどうかを確認します.

  1. まず、pjsip ライブラリを取得します。svn co http://svn.pjsip.org/repos/pjproject/trunk pjproject
  2. `./configure --prefix=/usr/local を実行します
  3. make dep & make
  4. sudo make install

  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-build を実行します ( Android プロジェクトに別の .so ファイルをロードするにはどうすればよいですか? )
  10. ADT に追加
  11. プロジェクトを閉じます。ネイティブ サポートを Java から Android に変更します。プロジェクトを開く (既存のプロジェクトを Eclipse で Android プロジェクトに変換しますか? )
  12. そのプロジェクトを私の TestPJ プロジェクトに追加します ( Android -> Library -> Add)
  13. Call 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): org.pjsip.pjsua.pjsuaJNI.swig_module_init(ネイティブ メソッド) 11-22 13:55:51.417: E/AndroidRuntime(11464): org.pjsip.pjsua.pjsuaJNI.(pjsuaJNI.java: 1450)

どんな助けでも素晴らしいでしょう。ありがとう!

4

2 に答える 2

3

Java および C からの JNI 呼び出しを調査するプロジェクトの例は、ここにあります。
質問に記載されているエラー (java.lang.UnsatisfiedLinkError: 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 ドキュメントからOracle ドキュメント、Java 6 JNI (Android 4.4 を使用している場合は Java 7) を参照してください。

-間違った Java メソッド名/シグネチャ/クラス名またはパッケージ名. このケースは、最初のケースとほぼ逆です。繰り返しますが、前述のエラーによると、メソッドの名前は「init」、クラス名は pjsuaJNI、パッケージは org.pjsip.pjsua でなければなりません。それらの少なくとも 1 つが間違っている場合、前述の例外が発生します。署名またはパラメータも正しい必要があります。このエラーの境界では、メソッドのパラメーターと見なすことができます (さらに、ネイティブ JNIEnv* と jobject が表示されます)。そのため、必要に応じてチェックして修正する必要があります。
ネイティブ コードから Java 署名への呼び出しの場合、文字列としてパラメータを持つ Java メソッドの表現と見なすことができ、Java *.class ファイルに適用された javap -s *.class コマンドで表示できます。そして、質問からの最後の警告では、メソッドのこの署名を見ることができます。

また、メソッドを使用するには、pjsip ライブラリをロードする必要がありますJava クラスのいくつかの静的セクションの System.loadLibrary() 。

残念ながら、この問題は実行時に発生します (コンパイル時に発生するとよいでしょう)。

于 2013-11-05T19:04:14.100 に答える
0

少し遅くなりましたが、私はこれを助けようとします。あなたの問題は、ネイティブ メソッドがextern "C"{}C++ で囲まれておらず、名前マングリングに関連しているはずだと思います。

1 つのネイティブ C 関数を として宣言しないとextern "C"、C++ ビルドがそれを台無しにし、JNI メカニズムは提供された署名に一致するネイティブ メソッドを見つけることができません。一方、それを外部 C 関数として宣言すると、ビルダーはマングルされたバージョンと管理されていないバージョンの両方を作成し、JNI は適切なバージョンを見つけることができます。

お役に立てれば。

于 2013-11-15T21:15:48.307 に答える