Portál AbcLinuxu, 11. května 2025 10:28

Dotaz: Java jni: java.lang.UnsatisfiedLinkError: undefined symbol: JAWT_GetAW

14.2.2009 16:55 kaplan
Java jni: java.lang.UnsatisfiedLinkError: undefined symbol: JAWT_GetAW
Přečteno: 685×
Odpovědět | Admin

Dobrý den,

pokouším se přehrát video v mé java aplikaci pomocí mplayeru. Proto, abych byl schopen získat wid komponenty pro mplayer používám jni. Tento postup jsem vygooglil.

 

Vytvořil jsem si ExtendedCavas.java:

<code>

package jmediacenter.extendedCanvas;

public class ExtendedCanvas extends java.awt.Canvas
{
    private static final long serialVersionUID = 1L;
    public native int getNativeWindow();

    static
    {
        try
        {
            System.loadLibrary("ExtendedCanvas");
        }
        catch (Throwable e)
        {
            e.printStackTrace();
            System.exit(1);
        }
    }
}

</code>

 

Zkompiloval a pomocí javah vytvořil hlavičkový soubor: javah -jni jmediacenter.extendedCanvas.ExtendedCanvas.

 

Toto je vygooglený kód pro nativní metodu: jmediacenter_extendedCanvas_ExtendedCanvas.c:

<code>

#include <jni.h>
#include <jawt.h>
#include <jawt_md.h>
#include <assert.h>
#ifdef WIN32
#include <windows.h>
#endif

#include "jmediacenter_extendedCanvas_ExtendedCanvas.h"

JNIEXPORT jint JNICALL Java_jmediacenter_extendedCanvas_ExtendedCanvas_getNativeWindow
  (JNIEnv *env, jobject obj_this)
{
jboolean result;
        jint lock;

        JAWT awt;
        JAWT_DrawingSurface* ds;
        JAWT_DrawingSurfaceInfo* dsi;
#ifdef WIN32
      JAWT_Win32DrawingSurfaceInfo* dsi_win;
      HWND hWnd;
#else
        JAWT_X11DrawingSurfaceInfo* dsi_x11;
#endif

        /* Get the AWT */
        awt.version = JAWT_VERSION_1_3;
        result = JAWT_GetAWT(env, &awt);
        if(result == JNI_FALSE) return -1;

        /* Get the drawing surface */
        if ((ds = awt.GetDrawingSurface(env, obj_this)) == NULL)
                return 0L;

        /* Lock the drawing surface */
        lock = ds->Lock(ds);
        if((lock & JAWT_LOCK_ERROR)  ) {
                return -1;
        }

        /* Get the drawing surface info */
        dsi = ds->GetDrawingSurfaceInfo(ds);

        /* Get the platform-specific drawing info */
#ifdef WIN32
      dsi_win = (JAWT_Win32DrawingSurfaceInfo*)dsi->platformInfo;
      //hdc= dsi_win->hdc;
      hWnd = dsi_win->hwnd;
      return ((jlong)hWnd);
#else
        dsi_x11 = (JAWT_X11DrawingSurfaceInfo*)dsi->platformInfo;
        int id = dsi_x11->drawable;

        ds->Unlock(ds);
        return id;
#endif
}
</code>

 

Z tohoto jsem si vytvořil knihovnu:

gcc -shared -I/usr/java/jdk1.6.0_06/include -I/usr/java/jdk1.6.0_06/include/linux -o libExtendedCanvas.so jmediacenter_extendedCanvas_ExtendedCanvas.c

 

Cestu ke knihovně mám vloženou do -Djava.library.path. Cesty k ostatním knihovnám z .../jre/lib/i386 jsem přidal do dl.so.conf a použil dlconfig.

 

Když potom spustím mojí aplikaci dostanu následující error:

java.lang.UnsatisfiedLinkError: .../libExtendedCanvas.so: .../libExtendedCanvas.so: undefined symbol: JAWT_GetAWT
    at java.lang.ClassLoader$NativeLibrary.load(Native Method)
    at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1751)
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1676)
    at java.lang.Runtime.loadLibrary0(Runtime.java:823)
    at java.lang.System.loadLibrary(System.java:1030)
    at jmediacenter.extendedCanvas.ExtendedCanvas.<clinit>(ExtendedCanvas.java:29)
 

ldd libExtendedCanvas.so hlásí toto:

        linux-gate.so.1 =>  (0xffffe000)
        libc.so.6 => /lib/i686/libc.so.6 (0xb7dab000)
        /lib/ld-linux.so.2 (0x80000000)
 

Toto mě ale zaráží, protože předpokládám, že tato knihovna bude potřebovat min. libjawt.so ale jak je vidět nepotřebuje. Zde bude asi probém. Nevím si s tím rady.

 

Díky za každou radu.

Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Luboš Doležel (Doli) avatar 16.2.2009 01:49 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
Rozbalit Rozbalit vše Re: Java jni: java.lang.UnsatisfiedLinkError: undefined symbol: JAWT_GetAW
Odpovědět | | Sbalit | Link | Blokovat | Admin
Toto mě ale zaráží, protože předpokládám, že tato knihovna bude potřebovat min. libjawt.so ale jak je vidět nepotřebuje.
Ale potřebuje, jen jste linkeru neřekl, že se má knihovna s libjawt.so linkovat (-ljawt ?).
17.2.2009 20:42 kaplan
Rozbalit Rozbalit vše Re: Java jni: java.lang.UnsatisfiedLinkError: undefined symbol: JAWT_G
Odpovědět | | Sbalit | Link | Blokovat | Admin

Problém vyřešen.

Stačilo při kompilaci knihovny přilinkovat knihovnu libjawt.so:

gcc -shared -I/usr/java/jdk1.6.0_06/include -I/usr/java/jdk1.6.0_06/include/linux -o libExtendedCanvas.so jmediacenter_extendedCanvas_ExtendedCanvas.c -L/usr/java/jdk1.6.0_06/jre/lib/i386 -ljawt

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.