2013-07-15 4 views
1

У меня есть один файл C++ dll. И я знаю методы, используемые в нем. Мне нужно вызвать эти методы из моего java-кода. У меня нет доступа к изменению файла DLL. Пожалуйста, предоставьте мне решение для этого.Как получить доступ к методу библиотеки C++ (DLL) в java

+0

http://stackoverflow.com/questions/14706193/how-to-access-a-method-of-c-library-dll-from-java – Reddy

+0

вы также можете использовать Google «JNI». – alexbuisson

+0

Вы не можете вызывать методы C++, экспортированные в dll с другого языка. C++ не имеет стандартного ABI, который позволяет это надежным способом. Вам придется «сгладить» методы C++ до C-интерфейса. – greatwolf

ответ

2

Я создал JavaCPP именно для этой цели. Я копировать/вставить некоторые примеры кода и объяснение на странице:

Наиболее распространенный случай использования включает в себя доступ к некоторой унаследованной библиотеке, написанную для C++, например, в файл с именем LegacyLibrary.h, содержащей этот C++ класса:

#include <string> 

namespace LegacyLibrary { 
    class LegacyClass { 
     public: 
      const std::string& get_property() { return property; } 
      void set_property(const std::string& property) { this->property = property; } 
      std::string property; 
    }; 
} 

чтобы получить работу с JavaCPP, мы можем легко определить класс Java, такие как этот, - хотя можно было бы использовать парсер для получения его из заголовка файла, как показано ниже:

import com.googlecode.javacpp.*; 
import com.googlecode.javacpp.annotation.*; 

@Platform(include="LegacyLibrary.h") 
@Namespace("LegacyLibrary") 
public class LegacyLibrary { 
    public static class LegacyClass extends Pointer { 
     static { Loader.load(); } 
     public LegacyClass() { allocate(); } 
     private native void allocate(); 

     // to call the getter and setter functions 
     public native @StdString String get_property(); public native void set_property(String property); 

     // to access the member variable directly 
     public native @StdString String property();  public native void property(String property); 
    } 

    public static void main(String[] args) { 
     // Pointer objects allocated in Java get deallocated once they become unreachable, 
     // but C++ destructors can still be called in a timely fashion with Pointer.deallocate() 
     LegacyClass l = new LegacyClass(); 
     l.set_property("Hello World!"); 
     System.out.println(l.property()); 
    } 
} 

В качестве альтернативы мы можем создать интерфейс Java разбора заголовка файла с классом конфигурации, такие как этот:

@Properties(target="LegacyLibrary", [email protected](include="LegacyLibrary.h")) 
public class LegacyLibraryConfig implements Parser.InfoMapper { 
    public void map(Parser.InfoMap infoMap) { 
    } 
} 

И следующие команды создания:

$ javac -cp javacpp.jar LegacyLibraryConfig.java 
$ java -jar javacpp.jar LegacyLibraryConfig 
$ javac -cp javacpp.jar LegacyLibrary.java 
$ java -jar javacpp.jar LegacyLibrary 

Для более сложных примеров, включая Maven/IDE интеграции, проверить JavaCPP Presets!

+0

Отличная работа! Я очень рад узнать ваш инструмент JavaCPP, потому что раньше я сталкивался с подобной проблемой. Я потрачу некоторое время на изучение этого! Спасибо! –

+0

BTW, может ли JavaCPP вызывать функции в DLL-файле непосредственно в Java-коде, учитывая, что я не знаю деталей этой DLL. –

+0

@AnnieKim Нам нужен хотя бы заголовочный файл и компилятор C++, но все остальное довольно автоматизировано. –

Смежные вопросы