Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   Java (http://www.velocityreviews.com/forums/f30-java.html)
-   -   Loading a 3rd party from a java code (http://www.velocityreviews.com/forums/t743474-loading-a-3rd-party-from-a-java-code.html)

dvir shaty 02-13-2011 08:42 AM

Loading a 3rd party from a java code
 
Hi all,

I am trying to load a function from a 3rd party DLL from my java code
(in eclipse).

Can you please tell me how to do it?

I tried to use the following:

------------------------------------------------
package tal.packege;
class talclient
{
static
{
System.loadLibrary("talclient");
}
public static void main(String ar[])
{
System.out.println("Hello world from Java");
talclient t=new talclient();
String s = "172.16.10.31";
int a = 8888;
int b = 0;
t.tal_connect(s,a,b);

}
public native void tal_connect(String s, int a, int b);
}

------------------------------------------------


I get the following exception:


Exception in thread "main" java.lang.UnsatisfiedLinkError:
tal.packege.talclient.vtc_connect(Ljava/lang/String;II)V
at tal.packege.talclient.vtc_connect(Native Method)
at tal.packege.talclient.main(talclient.java:16)

According to the dll help file the arguments are defined as:

int tal_connect( char *servername,
Int portnum,
Int options)

The dll is stored in c:\windows\system32.


Thanks, Dvir.

dvir shaty 02-13-2011 09:59 AM

Re: Loading a 3rd party from a java code
 
To make things clearer, the DLL is a C DLL.

Joshua Cranmer 02-13-2011 01:53 PM

Re: Loading a 3rd party from a java code
 
On 02/13/2011 03:42 AM, dvir shaty wrote:
> According to the dll help file the arguments are defined as:
>
> int tal_connect( char *servername,
> Int portnum,
> Int options)


How does Java know that? DLLs would just store the exported function as
"tal_connect", with no type information whatsoever, so Java has no clue
what the type information is.

If it is just a raw C DLL, you will have to write the native JNI code to
do that. Googling `JNI tutorial' should give it to you.

--
Beware of bugs in the above code; I have only proved it correct, not
tried it. -- Donald E. Knuth

Arne Vajh°j 02-13-2011 04:23 PM

Re: Loading a 3rd party from a java code
 
On 13-02-2011 03:42, dvir shaty wrote:
> I am trying to load a function from a 3rd party DLL from my java code
> (in eclipse).
>
> Can you please tell me how to do it?
>
> I tried to use the following:
>
> ------------------------------------------------
> package tal.packege;
> class talclient
> {
> static
> {
> System.loadLibrary("talclient");
> }
> public static void main(String ar[])
> {
> System.out.println("Hello world from Java");
> talclient t=new talclient();
> String s = "172.16.10.31";
> int a = 8888;
> int b = 0;
> t.tal_connect(s,a,b);
>
> }
> public native void tal_connect(String s, int a, int b);
> }
>
> ------------------------------------------------
>
>
> I get the following exception:
>
>
> Exception in thread "main" java.lang.UnsatisfiedLinkError:
> tal.packege.talclient.vtc_connect(Ljava/lang/String;II)V
> at tal.packege.talclient.vtc_connect(Native Method)
> at tal.packege.talclient.main(talclient.java:16)
>
> According to the dll help file the arguments are defined as:
>
> int tal_connect( char *servername,
> Int portnum,
> Int options)
>
> The dll is stored in c:\windows\system32.


JNI does not support calling arbitrary functions in a
DLL.

You need to create wrapper function and DLL that is
JNI compatible and call that.

Arne

Ian Shef 02-15-2011 11:35 PM

Re: Loading a 3rd party from a java code
 
Arne Vajh°j <arne@vajhoej.dk> wrote in news:4d580572$0$23756$14726298
@news.sunsite.dk:

> On 13-02-2011 03:42, dvir shaty wrote:
>> I am trying to load a function from a 3rd party DLL from my java code
>> (in eclipse).
>>
>> Can you please tell me how to do it?
>>
>> I tried to use the following:
>>
>> ------------------------------------------------
>> package tal.packege;
>> class talclient
>> {
>> static
>> {
>> System.loadLibrary("talclient");
>> }
>> public static void main(String ar[])
>> {
>> System.out.println("Hello world from Java");
>> talclient t=new talclient();
>> String s = "172.16.10.31";
>> int a = 8888;
>> int b = 0;
>> t.tal_connect(s,a,b);
>>
>> }
>> public native void tal_connect(String s, int a, int b);
>> }
>>
>> ------------------------------------------------
>>
>>
>> I get the following exception:
>>
>>
>> Exception in thread "main" java.lang.UnsatisfiedLinkError:
>> tal.packege.talclient.vtc_connect(Ljava/lang/String;II)V
>> at tal.packege.talclient.vtc_connect(Native Method)
>> at tal.packege.talclient.main(talclient.java:16)
>>
>> According to the dll help file the arguments are defined as:
>>
>> int tal_connect( char *servername,
>> Int portnum,
>> Int options)
>>
>> The dll is stored in c:\windows\system32.

>
> JNI does not support calling arbitrary functions in a
> DLL.
>
> You need to create wrapper function and DLL that is
> JNI compatible and call that.
>
> Arne
>

And furthermore...
- Your code calls tal_connect, but the error message is for vtc_connect.
- char * is NOT the same as java.lang.String





Arne Vajh°j 02-16-2011 01:54 AM

Re: Loading a 3rd party from a java code
 
On 15-02-2011 18:35, Ian Shef wrote:
> Arne Vajh°j<arne@vajhoej.dk> wrote in news:4d580572$0$23756$14726298
> @news.sunsite.dk:
>
>> On 13-02-2011 03:42, dvir shaty wrote:
>>> I am trying to load a function from a 3rd party DLL from my java code
>>> (in eclipse).
>>>
>>> Can you please tell me how to do it?
>>>
>>> I tried to use the following:
>>>
>>> ------------------------------------------------
>>> package tal.packege;
>>> class talclient
>>> {
>>> static
>>> {
>>> System.loadLibrary("talclient");
>>> }
>>> public static void main(String ar[])
>>> {
>>> System.out.println("Hello world from Java");
>>> talclient t=new talclient();
>>> String s = "172.16.10.31";
>>> int a = 8888;
>>> int b = 0;
>>> t.tal_connect(s,a,b);
>>>
>>> }
>>> public native void tal_connect(String s, int a, int b);
>>> }
>>>
>>> ------------------------------------------------
>>>
>>>
>>> I get the following exception:
>>>
>>>
>>> Exception in thread "main" java.lang.UnsatisfiedLinkError:
>>> tal.packege.talclient.vtc_connect(Ljava/lang/String;II)V
>>> at tal.packege.talclient.vtc_connect(Native Method)
>>> at tal.packege.talclient.main(talclient.java:16)
>>>
>>> According to the dll help file the arguments are defined as:
>>>
>>> int tal_connect( char *servername,
>>> Int portnum,
>>> Int options)
>>>
>>> The dll is stored in c:\windows\system32.

>>
>> JNI does not support calling arbitrary functions in a
>> DLL.
>>
>> You need to create wrapper function and DLL that is
>> JNI compatible and call that.


> And furthermore...
> - Your code calls tal_connect, but the error message is for vtc_connect.
> - char * is NOT the same as java.lang.String


Both will somewhat become obvious when creating the
JNI wrapper.

The output from javah will show a lot.

Arne



All times are GMT. The time now is 09:09 AM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.