2013-05-13 6 views
8

は、使用および方法は、このようなPJSIPライブラリとしてCでコンパイルされたライブラリからの呼び出しを起動する方法はありますか?どのようにJavaをPJSIPとしてCライブラリを使用するには?

私は私がコンパイルしたPJSIP libにからの呼び出しを使用して起動したいが、明らかに問題がPJSIPは、jarファイル、つまりCライブラリではないのJavaライブラリであるということです。

可能ですか?たぶんJNI?

おかげ

編集:手元の作業を行うためにガブガブ飲むを使用してみましたが、それがないすべては、空のクラスファイルを作成することです。ここ

は、私はSWIGを実行するために使用するコマンドです:SWIGコマンドから

swig -verbose -java -package com.josh.sip.util -o jni_wrapper.c pjsua.i 

出力

Language subdirectory: java 
Search paths: 
    .\ 
    .\swig_lib\java\ 
    C:\Users\jonney\Downloads\swigwin-2.0.9\Lib\java\ 
    .\swig_lib\ 
    C:\Users\jonney\Downloads\swigwin-2.0.9\Lib\ 
Preprocessing... 
Starting language-specific parse... 
Processing types... 
C++ analysis... 
Generating wrappers... 

それは私のために作成しpjsua Javaクラス:

/* ---------------------------------------------------------------------------- 
* This file was automatically generated by SWIG (http://www.swig.org). 
* Version 2.0.9 
* 
* Do not make changes to this file unless you know what you are doing--modify 
* the SWIG interface file instead. 
* ----------------------------------------------------------------------------- */ 

package com.josh.sip.util; 

public class pjsua { 
} 

pjsua JNIそれは私

のために作成するファイル
/* ---------------------------------------------------------------------------- 
* This file was automatically generated by SWIG (http://www.swig.org). 
* Version 2.0.9 
* 
* Do not make changes to this file unless you know what you are doing--modify 
* the SWIG interface file instead. 
* ----------------------------------------------------------------------------- */ 

package com.josh.sip.util; 

public class pjsuaJNI { 
} 

それは以下の私のために生成さjni_wrapper.c:

/* ---------------------------------------------------------------------------- 
* This file was automatically generated by SWIG (http://www.swig.org). 
* Version 2.0.9 
* 
* This file is not intended to be easily readable and contains a number of 
* coding conventions designed to improve portability and efficiency. Do not make 
* changes to this file unless you know what you are doing--modify the SWIG 
* interface file instead. 
* ----------------------------------------------------------------------------- */ 

#define SWIGJAVA 

/* ----------------------------------------------------------------------------- 
* This section contains generic SWIG labels for method/variable 
* declarations/attributes, and other compiler dependent labels. 
* ----------------------------------------------------------------------------- */ 

/* template workaround for compilers that cannot correctly implement the C++ standard */ 
#ifndef SWIGTEMPLATEDISAMBIGUATOR 
# if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x560) 
# define SWIGTEMPLATEDISAMBIGUATOR template 
# elif defined(__HP_aCC) 
/* Needed even with `aCC -AA' when `aCC -V' reports HP ANSI C++ B3910B A.03.55 */ 
/* If we find a maximum version that requires this, the test would be __HP_aCC <= 35500 for A.03.55 */ 
# define SWIGTEMPLATEDISAMBIGUATOR template 
# else 
# define SWIGTEMPLATEDISAMBIGUATOR 
# endif 
#endif 

/* inline attribute */ 
#ifndef SWIGINLINE 
# if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__)) 
# define SWIGINLINE inline 
# else 
# define SWIGINLINE 
# endif 
#endif 

/* attribute recognised by some compilers to avoid 'unused' warnings */ 
#ifndef SWIGUNUSED 
# if defined(__GNUC__) 
# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) 
#  define SWIGUNUSED __attribute__ ((__unused__)) 
# else 
#  define SWIGUNUSED 
# endif 
# elif defined(__ICC) 
# define SWIGUNUSED __attribute__ ((__unused__)) 
# else 
# define SWIGUNUSED 
# endif 
#endif 

#ifndef SWIG_MSC_UNSUPPRESS_4505 
# if defined(_MSC_VER) 
# pragma warning(disable : 4505) /* unreferenced local function has been removed */ 
# endif 
#endif 

#ifndef SWIGUNUSEDPARM 
# ifdef __cplusplus 
# define SWIGUNUSEDPARM(p) 
# else 
# define SWIGUNUSEDPARM(p) p SWIGUNUSED 
# endif 
#endif 

/* internal SWIG method */ 
#ifndef SWIGINTERN 
# define SWIGINTERN static SWIGUNUSED 
#endif 

/* internal inline SWIG method */ 
#ifndef SWIGINTERNINLINE 
# define SWIGINTERNINLINE SWIGINTERN SWIGINLINE 
#endif 

/* exporting methods */ 
#if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) 
# ifndef GCC_HASCLASSVISIBILITY 
# define GCC_HASCLASSVISIBILITY 
# endif 
#endif 

#ifndef SWIGEXPORT 
# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) 
# if defined(STATIC_LINKED) 
#  define SWIGEXPORT 
# else 
#  define SWIGEXPORT __declspec(dllexport) 
# endif 
# else 
# if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY) 
#  define SWIGEXPORT __attribute__ ((visibility("default"))) 
# else 
#  define SWIGEXPORT 
# endif 
# endif 
#endif 

/* calling conventions for Windows */ 
#ifndef SWIGSTDCALL 
# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) 
# define SWIGSTDCALL __stdcall 
# else 
# define SWIGSTDCALL 
# endif 
#endif 

/* Deal with Microsoft's attempt at deprecating C standard runtime functions */ 
#if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE) 
# define _CRT_SECURE_NO_DEPRECATE 
#endif 

/* Deal with Microsoft's attempt at deprecating methods in the standard C++ library */ 
#if !defined(SWIG_NO_SCL_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_SCL_SECURE_NO_DEPRECATE) 
# define _SCL_SECURE_NO_DEPRECATE 
#endif 



/* Fix for jlong on some versions of gcc on Windows */ 
#if defined(__GNUC__) && !defined(__INTEL_COMPILER) 
    typedef long long __int64; 
#endif 

/* Fix for jlong on 64-bit x86 Solaris */ 
#if defined(__x86_64) 
# ifdef _LP64 
# undef _LP64 
# endif 
#endif 

#include <jni.h> 
#include <stdlib.h> 
#include <string.h> 


/* Support for throwing Java exceptions */ 
typedef enum { 
    SWIG_JavaOutOfMemoryError = 1, 
    SWIG_JavaIOException, 
    SWIG_JavaRuntimeException, 
    SWIG_JavaIndexOutOfBoundsException, 
    SWIG_JavaArithmeticException, 
    SWIG_JavaIllegalArgumentException, 
    SWIG_JavaNullPointerException, 
    SWIG_JavaDirectorPureVirtual, 
    SWIG_JavaUnknownError 
} SWIG_JavaExceptionCodes; 

typedef struct { 
    SWIG_JavaExceptionCodes code; 
    const char *java_exception; 
} SWIG_JavaExceptions_t; 


static void SWIGUNUSED SWIG_JavaThrowException(JNIEnv *jenv, SWIG_JavaExceptionCodes code, const char *msg) { 
    jclass excep; 
    static const SWIG_JavaExceptions_t java_exceptions[] = { 
    { SWIG_JavaOutOfMemoryError, "java/lang/OutOfMemoryError" }, 
    { SWIG_JavaIOException, "java/io/IOException" }, 
    { SWIG_JavaRuntimeException, "java/lang/RuntimeException" }, 
    { SWIG_JavaIndexOutOfBoundsException, "java/lang/IndexOutOfBoundsException" }, 
    { SWIG_JavaArithmeticException, "java/lang/ArithmeticException" }, 
    { SWIG_JavaIllegalArgumentException, "java/lang/IllegalArgumentException" }, 
    { SWIG_JavaNullPointerException, "java/lang/NullPointerException" }, 
    { SWIG_JavaDirectorPureVirtual, "java/lang/RuntimeException" }, 
    { SWIG_JavaUnknownError, "java/lang/UnknownError" }, 
    { (SWIG_JavaExceptionCodes)0, "java/lang/UnknownError" } 
    }; 
    const SWIG_JavaExceptions_t *except_ptr = java_exceptions; 

    while (except_ptr->code != code && except_ptr->code) 
    except_ptr++; 

    (*jenv)->ExceptionClear(jenv); 
    excep = (*jenv)->FindClass(jenv, except_ptr->java_exception); 
    if (excep) 
    (*jenv)->ThrowNew(jenv, excep, msg); 
} 


/* Contract support */ 

#define SWIG_contract_assert(nullreturn, expr, msg) if (!(expr)) {SWIG_JavaThrowException(jenv, SWIG_JavaIllegalArgumentException, msg); return nullreturn; } else 


#include "pjsua.h" 


#ifdef __cplusplus 
extern "C" { 
#endif 

#ifdef __cplusplus 
} 
#endif 

その簡単にSWIGのコマンドを実行しながら、あらゆるアドバイスの両方を検索して、私は私の.iファイルと同じ場所内部pjsua.hファイルを持っています?

基本的にswigや他のツールでpjsuaやpjsip javaクラスを作成し、その実装やインタフェースメソッドを使って実際にライブラリを使用することができます。このような、このSIPスタック

+1

[JNA](https://github.com/twall/jna)は、JNIが当然の選択です。 – millimoose

+0

にはまだ問題があります。 Cソースコードにあるすべての関数を使ってjniを生成することはできません。私はさらに、Cのソースコードをコピーして、すべてのjNIのものと同じ場所にコピーしようとしました。ヘッダーも含めて – jonney

答えて

3

はJNAeratorとJNAを試してみてください。私は自分のプロジェクトでそれを使いました。

+0

これがトリックでした。それを動作させるにはかなり戸惑いましたが、最終的には – jonney

+0

@jonneyはJNAクラス/インターフェースを提供できますか?たぶんgithubのリンクですか? – Chriss

3

のないJavaのバージョンが存在しないことを痛みとして

あなたはヘッダファイルを持っている場合は、SWIGを使用することで、これを行うための最も簡単な方法は、私を見つけました。あなたのモジュール(ライブラリ)のためyourmodule.iファイルを作成し、JNI経由でアクセスするすべてのクラスが含まれています。例:

%module Foo 
%{ 
#include "Bar.h" 
%} 

また、CからJava構造体へのタイプマップを提供することもできます。あなたが特定のメソッドを無視したい場合は

%ignore fooBar(int baz); 

あなたはこのようないくつかのJavaクラスを生成するためにSWIGを実行することができます:

swig -c -verbose -java -package com.your.java.package -o jni_wrapper.c yourfile.i 

は、より多くの情報と例についてはJava documentationを参照してください。 https://code.google.com/p/jnaerator

+0

こんにちは。これは興味深いように見えるので、.iファイルを作成し、同様のコードスニペットを追加して、JavaクラスFooがBar.Hの関数またはヘッダーファイルを表し、SWIGを使用して、アクセス権を持つクラスFooを自動的に生成できるBar.hのすべてのコードに? – jonney

+0

こんにちは私は上記の提案の手順に従って、それはすべてJNIで定義されたメソッドのない空のクラスを生成した。何かアドバイス? – jonney

+0

文書を読んだことがありますか?そこにはたくさんの例があります。 '.i'ファイルの中にヘッダファイルを手動で組み込む必要があるかもしれません。 –

2

Javacpp私は以前に使ったことがあり、それはかなりうまくいきました。ここに必要なのは単なる橋であり、SWIGはあまりフレンドリーではなく、私はそれ以前に多くの時間を無駄にしました。

リクエストされた特定のライブラリについては、pjsip-jni、javaとjniで書かれたpjsipのラッパーを試してください。

+0

Javacppはうまく動作します。javacppはjniを下位レベルで使用していますが、C++コードのラッピングには+ – anshulkatta

+0

が最適です – anshulkatta

関連する問題