سؤال

لقد اشتريت مكتبة Java تابعة لجهة خارجية تتضمن ملف JAR وملفين DLL.لقد كتبت برنامج Java الخاص بي والذي يستدعي ملف JAR التابع لجهة خارجية.الآن سؤالي هو كيف يمكنني تجميع كل التعليمات البرمجية الخاصة بي في ملف JAR واحد يتضمن جميع التعليمات البرمجية الخاصة بي وJAR وDLLs التابعة لجهات خارجية؟

أنا أعرف سبحانه وتعالى هو مثل هذه الحالة.ال swt.jar يتضمن ملفات dll، لكني لا أعرف كيفية القيام بذلك وكيفية جعله يعمل بشكل صحيح.

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

المحلول

فقط قم بتعبئتها في أي مكان في الجرة.هناك شيء واحد عليك أن تضعه في الاعتبار - قبل أن تتمكن من استخدام ملفات DLL، تحتاج إلى استخراجها فعليًا من JAR وتفريغها على القرص الصلب في مكان ما وإلا فلن تتمكن من تحميلها

لذا، فقد قمت بتنفيذ مشروع JNI للعميل حيث سأستخدم هذه الجرة المعبأة في الحرب.ومع ذلك - قبل تشغيل أي طرق أصلية، سأحصل على ملف DLL كمورد وأكتبه على القرص في الدليل المؤقت.ثم سأقوم بتشغيل رمز التهيئة العادي حيث يتم تعيين DLL الخاص بي على نفس الموقع الذي كتبت إليه DLL للتو

أوه ، وفقط في حالة:لا يوجد شيء مميز فيما يتعلق بتغليف ملف dll أو أي ملف آخر في الجرة.إنه مثل تعبئة الأشياء في ملف مضغوط

إليك بعض التعليمات البرمجية التي قمت باستخراجها للتو

public class Foo {
private static final String LIB_BIN = "/lib-bin/";
private final static Log logger = LogFactory.getLog(ACWrapper.class);
private final static String ACWRAPPER = "acwrapper";
private final static String AAMAPI = "aamapi51";
private final static String LIBEAU = "libeay32";

static {
    logger.info("Loading DLL");
    try {
        System.loadLibrary(ACWRAPPER);
        logger.info("DLL is loaded from memory");
    } catch (UnsatisfiedLinkError e) {
        loadFromJar();
    }
}

/**
 * When packaged into JAR extracts DLLs, places these into
 */
private static void loadFromJar() {
    // we need to put both DLLs to temp dir
    String path = "AC_" + new Date().getTime();
    loadLib(path, ACWRAPPER);
    loadLib(path, AAMAPI);
    loadLib(path, LIBEAU);
}

/**
 * Puts library to temp dir and loads to memory
 */
private static void loadLib(String path, String name) {
    name = name + ".dll";
    try {
        // have to use a stream
        InputStream in = ACWrapper.class.getResourceAsStream(LIB_BIN + name);
        // always write to different location
        File fileOut = new File(System.getProperty("java.io.tmpdir") + "/" + path + LIB_BIN + name);
        logger.info("Writing dll to: " + fileOut.getAbsolutePath());
        OutputStream out = FileUtils.openOutputStream(fileOut);
        IOUtils.copy(in, out);
        in.close();
        out.close();
        System.load(fileOut.toString());
    } catch (Exception e) {
        throw new ACCoreException("Failed to load required DLL", e);
    }
}
    // blah-blah - more stuff
}

نصائح أخرى

يستخدم http://www.jdotsoft.com/JarClassLoader.php والتي يمكنها تحميل ملفات DLL وJAR من JAR آخر مع تداخل غير محدود.على سبيل المثال، يمكن أن يكون ملف DLL موجودًا في JAR الموجود في JAR جذر آخر.يتم تحميل كافة ملفات DLL وJAR كما لو كانت في مسار فئة أو مسار مكتبة.

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