في محاولة لجعل DLL "Hello Word" في Visual Studio التي ستتقبلها Java Access الأصلي

StackOverflow https://stackoverflow.com/questions/2421767

  •  19-09-2019
  •  | 
  •  

سؤال

لقد قمت بنجاح بتجميع مكتبتي على Linux و Mac واستخدمها مع وصول Java الأصلي. لسوء الحظ، لا شيء أقوم به يعمل مع مترجم Visual Studio والوصول إلى Java الأصلي.

سأعود إلى الأساسيات وتحاول إنشاء DLL بسيطة للغاية في Visual Studio التي ستعمل Ajava Access Access معها، أي مساعدة ستكون موضع تقدير.

هنا gimmfivedll.c:

__declspec(dllexport) int gimmeFive()
{
    return 5;
}

إليك SystemLibrary.java:

import com.sun.jna.Native;


public class SystemLibrary {

public static final SystemLibrary instance = new SystemLibrary();

    static {
        Native.register("GimmeFiveDll");
    }

    public native int gimmeFive();
}

لقد حاولت بالفعل تحويل واجهة المكالمات إلى Stdcall في Visual Studio. لم أقدم أي تغييرات أخرى من الإعدادات الافتراضية وحدة التحكم في معالج المشروع الفارغ في مشروع Win32. في المثال فوق DLL الناتجة لا تصدير الوظيفة بشكل صحيح وفقا ل dumpbin.exe /exports. وبعد يقوم مشروعي الحقيقي بتصديرها بشكل صحيح ولكن في كلتا الحالتين، أحصل دائما على نفس استثناء JNA:

Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load library 'GimmeFiveDll': The specified module could not be found.

(نعم، وضعت gimmefivedll.dll في system32. نعم، أنا قادر على استخدام JNA للوصول إلى DLL الأخرى في System32 الذي يأتي مع Windows).

أي شخص على استعداد لمساعدتي في جولة هذا المثال الحد الأدنى ل DLL التي أنشأتها Visual Studio التي يحبها JNA؟

شكرا جزيلا.

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

المحلول

بعد يومين من ضجيج رأسي ضد جدار احسبته. المشكلة كانت أن C: Windows System32 ليس نظام دليل. يمكن تحميل quadleibrary () استخدامات () التي يستخدمها Native.register ()) DLL من آلة 64 بت! لذلك بدلا من ذلك، كان يحاول JNA نسخ المكتبة إلى موقع مؤقت وتحميله، لكن ذلك فشل. رسالة "الوحدة النمطية المحددة" لم تكن مفيدة بشكل فظيع وتعيينني في المسار الخطأ: -

على أي حال للإجابة على سؤالي الخاص هنا هو مثال على DLL الذي يمكن بناؤه باستخدام MSVC الذي يمكن أن يستخدمه Java (و JNA) (فقط ضعه في الدليل الصحيح لنظامك!):

gimmefivedll.c:

#ifdef __cplusplus
#error no C++, to keep this example simple
#endif

__declspec(dllexport) int gimmeFive()
{
    return 5;
}

dlltest.java:

import com.sun.jna.Native;

public class DllTest {

    static {
        Native.register("GimmeFiveDll");
    }

    public static native int gimmeFive();

    public static void main(String[] args) {
        System.out.println("I got: " + DllTest.gimmeFive());
    }
}

إذا سارت الأمور على ما يرام، فسيتم طباعة جافا "حصلت على: 5".

لاحظ أنه لم أجد أنه من الضروري تغيير إعدادات المحول البرمجي لاستخدام STDCall أو لإعلان __STDCALL في توقيع الوظيفة. في الواقع، هناك حاجة إلى تغييرات مترجم من مشروع DLL الفارغ الطبيعي الذي يخلق المعالج.

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