123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661 |
- <?xml version="1.0" encoding='utf-8'?>
- <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN"
- "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd" [
- <!-- Include general documentation entities -->
- <!ENTITY % docentities SYSTEM "../../../docbook/entities.xml">
- %docentities;
- ]>
- <!-- Module User's Guide -->
- <chapter>
-
- <title>&adminguide;</title>
-
- <!-- Section Overview -->
- <section>
- <title>Overview</title>
- <para>
- This module allows execution of Java compiled classes from the &kamailio;
- config file, exporting functions to access the SIP message from Java
- using the Java Native Interface (JNI).
- </para>
- </section>
- <!-- end op section Overview -->
-
- <!-- Section Dependencies -->
- <section>
- <title>Dependencies</title>
- <!-- Section Modules -->
- <section>
- <title>&kamailio; Modules</title>
- <para>
- The following modules must be loaded before this module:
- <itemizedlist>
- <listitem>
- <para>
- <emphasis>none</emphasis>.
- </para>
- </listitem>
- </itemizedlist>
- </para>
- </section>
- <!-- End of section Modules -->
-
- <!-- Section External Libraries or Applications -->
- <section>
- <title>External Libraries or Applications</title>
- <para>
- <!--
- The following libraries or applications must be installed before running
- &kamailio; with this module loaded:
- -->
- <itemizedlist>
- <para><emphasis>The following packages are runtime libraries, required to launch</emphasis></para>
- <listitem override="disc"><para><emphasis>java-common</emphasis> Base of all Java packages.</para></listitem>
- <listitem override="disc"><para><emphasis>default-jre</emphasis> Standard Java or Java compatible Runtime.</para></listitem>
- <listitem override="disc"><para><emphasis>gcj-jre</emphasis> Java runtime environment using GIJ/classpath.</para></listitem>
- <listitem override="disc"><para><emphasis>libgcj12 (>=12)</emphasis> Java runtime library for use with gcj.</para></listitem>
- </itemizedlist>
- <itemizedlist>
- <para><emphasis>The following packages are optional, required for development</emphasis></para>
- <listitem override="box"><para><emphasis>ant</emphasis> Java based build tool like make.</para></listitem>
- <listitem override="box"><para><emphasis>ant-contrib</emphasis> Collection of tasks, types and other tools for Apache Ant.</para></listitem>
- <listitem override="box"><para><emphasis>ant-gcj</emphasis> Java based build tool like make (GCJ).</para></listitem>
- <listitem override="box"><para><emphasis>default-jdk</emphasis> Standard Java or Java compatible Development Kit</para></listitem>
- <listitem override="box"><para><emphasis>gcj-jdk</emphasis> gcj and classpath development tools for Java(TM)</para></listitem>
- <listitem override="box"><para><emphasis>libgcj13-dev (>=12)</emphasis> Java development headers for use with gcj</para></listitem>
- <listitem override="box"><para><emphasis>jdk</emphasis> JDK Development Kit (either oracle jdk or openjdk)</para></listitem>
- </itemizedlist>
- </para>
- <para>
- The following libraries or applications must be compiled before
- running &kamailio; with this module loaded:
- <itemizedlist>
- <para><emphasis>The following packages are runtime libraries, required to launch</emphasis></para>
- <listitem override="circle"><para><emphasis><class_name></emphasis>.class</para></listitem>
- <listitem override="circle"><para><emphasis>&kamailiobinary;</emphasis>.jar</para></listitem>
- </itemizedlist>
- </para>
- </section>
- <!-- end of section External Libraries or Applications -->
- </section>
- <!-- end of section Dependencies -->
-
- <!-- Section Java Runtime -->
- <section>
- <title>Java runtime</title>
- <section>
- <title>JRE or JDK is required to use this module</title>
- <para>Java runtime library (JRE and JDK for building app_java) is required to use this module.</para>
- </section>
- </section>
- <!-- end of section Java Runtime -->
-
- <!-- Section Parameters -->
- <section>
- <title>Parameters</title>
- <!-- class_name -->
- <section id="app_java.p.class_name">
- <title><varname>class_name</varname> (string)</title>
- <para>
- The class name should have the same compiled file name.
- If the value is <emphasis>"&kamailio;"</emphasis>, then the compiled file should be named as <emphasis>"&kamailio;.class"</emphasis>.
- </para>
- <para>
- <emphasis>
- Default value is <quote>&kamailio;</quote>.
- </emphasis>
- </para>
- <example>
- <title>Set <varname>class_name</varname> parameter</title>
- <programlisting format="linespecific">
- ...
- modparam("app_java", "class_name", "&kamailio;")
- ...
- </programlisting>
- </example>
- </section>
- <!-- child_init_method -->
- <section id="app_java.p.child_init_method">
- <title><varname>child_init_method</varname> (string)</title>
- <para>
- TBD.
- </para>
- <para>
- <emphasis>
- Default value is <quote>child_init</quote>.
- </emphasis>
- </para>
- <example>
- <title>Set <varname>child_init_method</varname> parameter</title>
- <programlisting format="linespecific">
- ...
- modparam("app_java", "child_init_method", "my_mod_init")
- ...
- </programlisting>
- </example>
- </section>
- <!-- java_options -->
- <section id="app_java.p.java_option">
- <title><varname>java_options</varname> (string)</title>
- <para>
- Java options for Java Virtual Machine.
- For more info read <ulink url="http://docs.oracle.com/javase/6/docs/technotes/tools/windows/java.html"><citetitle>java docs</citetitle></ulink>
- </para>
- <para>
- <emphasis>
- Default value is <quote>-Djava.compiler=NONE</quote>.
- </emphasis>
- </para>
- <example>
- <title>Set <varname>java_options</varname> parameter</title>
- <programlisting format="linespecific">
- ...
- modparam("app_java", "java_options", "-Djava.compiler=NONE")
- ...
- </programlisting>
- </example>
- <example>
- <title>Set <varname>java_options</varname> parameter (live configuration)</title>
- <programlisting format="linespecific">
- ...
- # Assumes "application java folder" is located at /opt/kamailio/java
- modparam("app_java", "java_options", "-Djava.compiler=NONE
- -Djava.class.path=/path/to/kamailio/modules:/opt/kamailio/java:
- /opt/kamailio/java/kamailio.jar")
- ...
- </programlisting>
- </example>
- <example>
- <title>Set <varname>java_options</varname> parameter (verbose configuration)</title>
- <programlisting format="linespecific">
- ...
- # Assumes "application java folder" is located at /opt/kamailio/java
- modparam("app_java", "java_options", "-verbose:gc,class,jni
- -Djava.compiler=NONE -Djava.class.path=/path/to/kamailio/modules:
- /opt/kamailio/java:/opt/kamailio/java/kamailio.jar")
- ...
- </programlisting>
- </example>
- <example>
- <title>Set <varname>java_options</varname> parameter (debug configuration)</title>
- <programlisting format="linespecific">
- ...
- # Assumes "application java folder" is located at /opt/kamailio/java
- modparam("app_java", "java_options", "-Xdebug -verbose:gc,class,jni
- -Djava.compiler=NONE -Djava.class.path=/path/to/kamailio/modules:
- /opt/kamailio/java:/opt/kamailio/java/kamailio.jar")
- ...
- </programlisting>
- </example>
- </section>
- <!-- force_cmd_exec -->
- <section id="app_java.p.force_cmd_exec">
- <title><varname>force_cmd_exec</varname> (int)</title>
- <para>
- This parameter forces execution a &kamailiobinary; comnmand with java native method <quote>KamExec</quote>.
- # Note: this is an untested yet feature, may cause (but may not) a memory leaks if used from embedded languages.
- </para>
- <para>
- <emphasis>
- Default value is <quote>0 (off)</quote>.
- </emphasis>
- </para>
- <example>
- <title>Set <varname>force_cmd_exec</varname> parameter</title>
- <programlisting format="linespecific">
- ...
- modparam("app_java", "force_cmd_exec", 1)
- ...
- </programlisting>
- </example>
- </section>
- </section>
- <!-- End of section Parameters -->
-
- <!-- Section Functions -->
- <section>
- <title>Functions</title>
-
- <!-- Section Common requirements -->
- <section>
- <title>
- Common requirements
- </title>
- <para>Each function has a required parameter <quote>method_signature</quote>. For more info
- see <ulink url="http://www.rgagnon.com/javadetails/java-0286.html"
- ><citetitle>Determine the signature of a method</citetitle></ulink>.
- Signature represents the variable type. The mapping between the Java type and C type
- is
- <programlisting format="linespecific">
- Type Chararacter
- boolean Z
- byte B
- char C
- double D
- float F
- int I
- long J
- object L
- short S
- void V
- Note that to specify an object, the "L" is followed by the
- object's class name and ends with a semi-colon, ';' .
- </programlisting>
- </para>
- <para> app_java supports the following signatures:
- <programlisting format="linespecific">
- Primitives: Z,B,C,D,F,I,J,L,S,V
- Objects:
- Ljava/lang/Boolean;
- Ljava/lang/Byte;
- Ljava/lang/Character;
- Ljava/lang/Double;
- Ljava/lang/Float;
- Ljava/lang/Integer;
- Ljava/lang/Long;
- Ljava/lang/Short;
- Ljava/lang/String;
- NULL parameter: V
- Each parameter passed to function will be cast according to given signature.
-
- Parameters are optional, ommitting a parameter meant the passed value is NULL.
- Parameters count should be exactly the same as signature count.
- Note 1: Arrays representation (symbol '[') is not supported yet.
- Note 2: You shall use a correct signature, e.g. the following examples of
- combinations are invalid:
- java_method_exec("ExampleMethod", "ZI", "False");
- java_method_exec("ExampleMethod", "LI", "something", "5");
- </programlisting>
- </para>
-
- </section>
- <!-- End of section Common Requirements -->
-
- <!-- Section java_method_exec -->
- <section id="app_java.f.java_method_exec">
- <title>java_method_exec(method, method_signature, [param1[, param2[, ...]]])</title>
- <para>Executes a java class method <emphasis>method</emphasis>. Parameter <emphasis>method_signature</emphasis> is required.</para>
- <itemizedlist>
- <listitem>
- <example>
- <title>Signature: "V"</title>
- <para>&kamailio; prototype</para>
- <programlisting format="linespecific">java_method_exec("ExampleMethod", "V");</programlisting>
- <para>Java prototype</para>
- <programlisting format="linespecific">public int ExampleMethod();</programlisting>
- <para>Example of usage:</para>
- <programlisting format="linespecific">
- # &kamailio;
- java_method_exec("ExampleMethod", "V");
- # Java
- public int ExampleMethod()
- {
- ... do something;
- return 1;
- }
- </programlisting>
- </example>
- </listitem>
-
- <listitem>
- <example>
- <title>Signature: "Ljava/lang/String;I"</title>
- <para>&kamailio; prototype</para>
- <programlisting format="linespecific">java_method_exec("ExampleMethod", "Ljava/lang/String;I", "Hello world", "5");</programlisting>
- <para>Java prototype</para>
- <programlisting format="linespecific">public int ExampleMethod(String param1, int param2);</programlisting>
- <para>In the above scenario parameter 2 ("5") will be cast to integer representation.</para>
- <para>Example of usage:</para>
- <programlisting format="linespecific">
- # &kamailio;
- java_method_exec("ExampleMethod", "Ljava/lang/String;I", "$mb", "$ml");
- # Java
- public int ExampleMethod(String SipMessageBuffer, int SipMessageLenght)
- {
- ... do something with buffer;
- return 1;
- }
- </programlisting>
- </example>
- </listitem>
- <listitem>
- <example>
- <title>Signature: "ZB"</title>
- <para>&kamailio; prototype</para>
- <programlisting format="linespecific">java_method_exec("ExampleMethod", "ZB", "true", "0x05");</programlisting>
- <para>Java prototype</para>
- <programlisting format="linespecific">public int ExampleMethod(boolean param1, byte param2);</programlisting>
- <para>In the above scenario parameter 1 ("true") will be cast to boolean representation.</para>
- <para>Example of usage:</para>
- <programlisting format="linespecific">
- # &kamailio;
- java_method_exec("ExampleMethod", "ZB", "true", "0x05");
- # Java
- public int ExampleMethod(boolean flagSet, byte bFlag);
- {
- if (flagSet)
- {
- ... do something with flags;
- }
- return 1;
- }
- </programlisting>
- </example>
- </listitem>
- </itemizedlist>
- </section>
- <!-- end of section java_method_exec -->
- <!-- Section java_staticmethod_method_exec -->
- <section id="app_java.f.java_staticmethod_exec">
- <title>java_staticmethod_exec(method, method_signature, [param1[, param2[, ...]]])</title>
- <para>Executes a Java static method <emphasis>method</emphasis>. Parameter <emphasis>method_signature</emphasis> is required.</para>
- <itemizedlist>
- <listitem>
- <example>
- <title>Signature: "V"</title>
- <para>&kamailio; prototype</para>
- <programlisting format="linespecific">java_staticmethod_exec("ExampleMethod", "V");</programlisting>
- <para>Java prototype</para>
- <programlisting format="linespecific">public static int ExampleMethod();</programlisting>
- <para>Example of usage:</para>
- <programlisting format="linespecific">
- # &kamailio;
- java_staticmethod_exec("ExampleMethod", "V");
- # Java
- public static int ExampleMethod()
- {
- ... do something;
- return 1;
- }
- </programlisting>
- </example>
- </listitem>
-
- <listitem>
- <example>
- <title>Signature: "Ljava/lang/String;I"</title>
- <para>&kamailio; prototype</para>
- <programlisting format="linespecific">java_staticmethod_exec("ExampleMethod", "Ljava/lang/String;I", "Hello world", "5");</programlisting>
- <para>Java prototype</para>
- <programlisting format="linespecific">public static int ExampleMethod(String param1, int param2);</programlisting>
- <para>In the above scenario parameter 2 ("5") will be cast to integer representation.</para>
- <para>Example of usage:</para>
- <programlisting format="linespecific">
- # &kamailio;
- java_staticmethod_exec("ExampleMethod", "Ljava/lang/String;I", "$mb", "$ml");
- # Java
- public static int ExampleMethod(String SipMessageBuffer, int SipMessageLenght)
- {
- ... do something with buffer;
- return 1;
- }
- </programlisting>
- </example>
- </listitem>
-
- <listitem>
- <example>
- <title>Signature: "ZB"</title>
- <para>&kamailio; prototype</para>
- <programlisting format="linespecific">java_staticmethod_exec("ExampleMethod", "ZB", "true", "0x05");</programlisting>
- <para>Java prototype</para>
- <programlisting format="linespecific">public static int ExampleMethod(boolean param1, byte param2);</programlisting>
- <para>In the above scenario parameter 1 ("true") will be cast to boolean representation.</para>
- <para>Example of usage:</para>
- <programlisting format="linespecific">
- # &kamailio;
- java_staticmethod_exec("ExampleMethod", "ZB", "true", "0x05");
- # Java
- public static int ExampleMethod(boolean flagSet, byte bFlag);
- {
- if (flagSet)
- {
- ... do something with flags;
- }
- return 1;
- }
- </programlisting>
- </example>
- </listitem>
-
- </itemizedlist>
- </section>
- <!-- end of section java_staticmethod_exec -->
-
- <!-- Section java_s_method_exec -->
- <section id="app_java.f.java_s_method_exec">
- <title>java_s_method_exec(method, method_signature, [param1[, param2[, ...]]])</title>
- <para>Executes a Java class synchronized method <emphasis>method</emphasis>. Parameter <emphasis>method_signature</emphasis> is required.</para>
- <para>For more info see <ulink url="http://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html"><citetitle>Synchronized Methods</citetitle></ulink></para>
- <itemizedlist>
- <listitem>
- <example>
- <title>Signature: "V"</title>
- <para>&kamailio; prototype</para>
- <programlisting format="linespecific">java_s_method_exec("ExampleMethod", "V");</programlisting>
- <para>Java prototype</para>
- <programlisting format="linespecific">public synchronized int ExampleMethod();</programlisting>
- <para>Example of usage:</para>
- <programlisting format="linespecific">
- # &kamailio;
- java_s_method_exec("ExampleMethod", "V");
- # Java
- public synchronized int ExampleMethod()
- {
- ... do something;
- return 1;
- }
- </programlisting>
- </example>
- </listitem>
-
- <listitem>
- <example>
- <title>Signature: "Ljava/lang/String;I"</title>
- <para>&kamailio; prototype</para>
- <programlisting format="linespecific">java_s_method_exec("ExampleMethod", "Ljava/lang/String;I", "Hello world", "5");</programlisting>
- <para>Java prototype</para>
- <programlisting format="linespecific">public synchronized int ExampleMethod(String param1, int param2);</programlisting>
- <para>In the above scenario parameter 2 ("5") will be cast to integer representation.</para>
- <para>Example of usage:</para>
- <programlisting format="linespecific">
- # &kamailio;
- java_s_method_exec("ExampleMethod", "Ljava/lang/String;I", "$mb", "$ml");
- # Java
- public synchronized int ExampleMethod(String SipMessageBuffer, int SipMessageLenght)
- {
- ... do something with buffer;
- return 1;
- }
- </programlisting>
- </example>
- </listitem>
-
- <listitem>
- <example>
- <title>Signature: "ZB"</title>
- <para>&kamailio; prototype</para>
- <programlisting format="linespecific">java_s_method_exec("ExampleMethod", "ZB", "true", "0x05");</programlisting>
- <para>Java prototype</para>
- <programlisting format="linespecific">public synchronized int ExampleMethod(boolean param1, byte param2);</programlisting>
- <para>In the above scenario parameter 1 ("true") will be cast to boolean representation.</para>
- <para>Example of usage:</para>
- <programlisting format="linespecific">
- # &kamailio;
- java_s_method_exec("ExampleMethod", "ZB", "true", "0x05");
- # Java
- public synchronized int ExampleMethod(boolean flagSet, byte bFlag);
- {
- if (flagSet)
- {
- ... do something with flags;
- }
- return 1;
- }
- </programlisting>
- </example>
- </listitem>
-
- </itemizedlist>
- </section>
- <!-- end of section java_s_method_exec -->
-
- <!-- Section java_s_staticmethod_exec -->
- <section id="app_java.f.java_s_staticmethod_exec">
- <title>java_s_staticmethod_exec(method, method_signature, [param1[, param2[, ...]]])</title>
- <para>Executes a java synchronized static method <emphasis>method</emphasis>. Parameter <emphasis>method_signature</emphasis> is required.</para>
- <para>For more info see <ulink url="http://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html"><citetitle>Synchronized Methods</citetitle></ulink></para>
- <itemizedlist>
- <listitem>
- <example>
- <title>Signature: "V"</title>
- <para>&kamailio; prototype</para>
- <programlisting format="linespecific">java_s_staticmethod_exec("ExampleMethod", "V");</programlisting>
- <para>Java prototype</para>
- <programlisting format="linespecific">public static synchronized int ExampleMethod();</programlisting>
- <para>Example of usage:</para>
- <programlisting format="linespecific">
- # &kamailio;
- java_s_staticmethod_exec("ExampleMethod", "V");
- # Java
- public static synchronized int ExampleMethod()
- {
- ... do something;
- return 1;
- }
- </programlisting>
- </example>
- </listitem>
-
- <listitem>
- <example>
- <title>Signature: "Ljava/lang/String;I"</title>
- <para>&kamailio; prototype</para>
- <programlisting format="linespecific">java_s_staticmethod_exec("ExampleMethod", "Ljava/lang/String;I", "Hello world", "5");</programlisting>
- <para>Java prototype</para>
- <programlisting format="linespecific">public static synchronized int ExampleMethod(String param1, int param2);</programlisting>
- <para>In the above scenario parameter 2 ("5") will be cast to integer representation.</para>
- <para>Example of usage:</para>
- <programlisting format="linespecific">
- # &kamailio;
- java_s_staticmethod_exec("ExampleMethod", "Ljava/lang/String;I", "$mb", "$ml");
- # Java
- public static synchronized int ExampleMethod(String SipMessageBuffer, int SipMessageLenght)
- {
- ... do something with buffer;
- return 1;
- }
- </programlisting>
- </example>
- </listitem>
-
- <listitem>
- <example>
- <title>Signature: "ZB"</title>
- <para>&kamailio; prototype</para>
- <programlisting format="linespecific">java_s_staticmethod_exec("ExampleMethod", "ZB", "true", "0x05");</programlisting>
- <para>Java prototype</para>
- <programlisting format="linespecific">public static synchronized int ExampleMethod(boolean param1, byte param2);</programlisting>
- <para>In the above scenario parameter 1 ("true") will be cast to boolean representation.</para>
- <para>Example of usage:</para>
- <programlisting format="linespecific">
- # &kamailio;
- java_s_staticmethod_exec("ExampleMethod", "ZB", "true", "0x05");
- # Java
- public static synchronized int ExampleMethod(boolean flagSet, byte bFlag);
- {
- if (flagSet)
- {
- ... do something with flags;
- }
- return 1;
- }
- </programlisting>
- </example>
- </listitem>
-
- </itemizedlist>
- </section>
- <!-- end of section java_s_method_exec -->
- </section>
- <!-- End of section Functions -->
-
- <!-- Section Java API-->
- <section>
- <title>Java Module API</title>
- <para></para>
-
- <!-- Section Minimal program skeleton -->
- <section>
- <title>Minimal program skeleton</title>
- <para></para>
- <example>
- <title>Minimal program skeleton</title>
- <para></para>
- <programlisting format="linespecific">
- import org.siprouter.*;
- import org.siprouter.NativeInterface.*;
- public class Kamailio extends NativeMethods
- {
- /* Here you should specify a full path to app_java.so */
- static
- {
- System.load("/opt/kamailio/lib/kamailio/modules/app_java.so");
- }
- /* Constructor. Do not remove !!! */
- public Kamailio()
- {
- }
- /*
- This method should be executed for each children process, immediately after forking.
- Required. Do not remove !!!
- */
- public int child_init(int rank)
- {
- return 1;
- }
- }
- </programlisting>
- </example>
- </section>
- <!-- End of section Minimal program skeleton -->
-
- </section>
- <!-- End of section Java API -->
-
- </chapter>
|