سؤال

وأنا استدعاء DLL مع مرور كائن رد functio إليها. واحدة من المهام غير المطبوعة بسيطة. لدي ذلك الحين، حلقة من تكرار 100 مرة، فقط طباعة مؤشر وبعض المطبوعات بعد الحلقة.


وهنا هو رمز C

extern "C" int Start(void* callback(CString))
{
   for(int j=0; j<100; j++)
    callback(AConvertToString(j));

   callback("in Start called from Java");
   callback("another line");
}

وهنا هو رمز جافا

public interface MyDll extends Library{
  MyDll INSTANCE = (MyDll) Native.loadLibrary("MyDll",MyDll.class);
     public interface MyCallback extends StdCallCallback {
            public boolean callback(String msg);
     }
     public int Start(MyCallback callback);
  }

//in main:
...
  MyDll myDll = (MyDll)MyDll.INSTANCE;
  myDll.Start(new MyDll.MyCallback() {
      public boolean callback(String msg) {
         System.out.println(msg);
          return true;          
      }
});

والإخراج أرقام 0..41 (YES 41 !!! لا 99) ثم "في البداية دعا من جاوة" متبوعة حادث مروع:

#
# An unexpected error has been detected by Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x7c809823, pid=468, tid=2636
#
# Java VM: Java HotSpot(TM) Client VM (10.0-b23 mixed mode, sharing windows-x86)
# Problematic frame:
# C  [kernel32.dll+0x9823]

ولقد قرأت الكثير (هنا أيضا) ولكن أنا لا يمكن العثور على المشكلة. وأنا على تشغيل JRE من Java6. لدي 1.5GB من الذاكرة على الجهاز الخاص بي. لم يتم استخدام DLL من قبل أي عملية أخرى (أي مشكلات التوافق).

وشكرا، عزرئيل

هل كانت مفيدة؟

المحلول

وحاول أن تكتب MyCallback الخاص باعتباره com.sun.jna.Callback بدلا باعتبارها com.sun.jna.win32.StdCallLibrary.StdCallCallback:

public interface MyDll extends Library{
  MyDll INSTANCE = (MyDll) Native.loadLibrary("MyDll",MyDll.class);
     public interface MyCallback extends Callback {
            public boolean callback(String msg);
     }
     public int Start(MyCallback callback);
  }

والتحيات، إيمانويل جيرار

نصائح أخرى

في حالتي تطوير تطبيق الاتصالات التي تستخدم دلل Win32 وكان الحال عكس ذلك.

وعن طريق com.sun.jna.Library وcom.sun.jna.Callback تحطمت دائما VM عند عودته من استدعاء الاستدعاء.

وبعد تغيير لcom.sun.jna.win32.StdCallLibrary وcom.sun.jna.win32.StdCallLibrary.StdCallCallback تم حل المشكلة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top