2013-08-27 15 views
5

Spędziłem wiele godzin starając się korzystać z funkcji C# w mojej aplikacji Java, ale nie miał powodzenia ... napisałem następujący lib w C#:Jak używać funkcji C# w Java przy użyciu JNA lib

public class Converter 
{ 

    public Converter() 
    { 
    } 

    public bool ConvertHtmlToPdf(String directoryPath) 
    { 
     //DO SOMETHING 
    } 
} 

Ta biblioteka dll wywołuje inną bibliotekę DLL w celu wykonania niektórych operacji, ale kiedy ją skompiluję, mogę znaleźć biblioteki DLL w folderze Realse i wszystko wydaje się być w porządku, więc skompilowałem je przy użyciu opcji 32-bitowej, 64-bitowej i Dowolnej CPU, aby upewnić się, że to nie mój problem.

Analizing moje pliki dll z Dependency Walker w 32-bitowy procesor i Każda opcja mówi, że IESHIMS.DLL nie można znaleźć, i pokazać wiadomość:

Ostrzeżenie: Przynajmniej jeden moduł zależność opóźnienie obciążenia nie było uznany. Ostrzeżenie: co najmniej jeden moduł ma nierozstrzygnięty import z powodu brakującej funkcji eksportu w module zależnym od opóźnienia.

Nie występuje z plikiem 64-bitowym, niestety nie mogę znaleźć funkcji ConvertHtmlToPdf.

Ponieważ nie wiem, czy jest to istotne, czy nie, mój drugi krok był w Kodzie Java.

Aby załadować moją bibliotekę zrobić:

System.setProperty("jna.library.path", "C:\\Program Files (x86)\\Facilit\\Target App\\lib"); 

i:

public interface IConversorLibrary extends Library { 

    IConversorLibrary INSTANCE = (IConversorLibrary) Native.loadLibrary("converter", IConversorLibrary.class); 

    void ConvertHtmlToPdf(String directoryPath); 
} 

(lib wydaje się być obciążenie udany, bo gdy próbuję usunąć plik dll z moja aplikacja działa ona mówi które nie mogą być usunięte, bo to jest w użyciu) i wreszcie:

IConversorLibrary.INSTANCE.ConvertHtmlToPdf(directoryPath); 

ale res ULT nie jest naprawdę tak życzę:

java.lang.UnsatisfiedLinkError: Error looking up function 'ConvertHtmlToPdf': Could not find the specified procedure. 

nie wiem, co robię źle, próbowałem wiele tutoriali i wiele rzeczy, ale wszystko wydaje się działać, każda pomoc jest bardzo ceniona.

+0

Ustawianie 'jna.library.path' nie jest tak naprawdę dzieje się wpływa na JNA; należy zamiast tego ustawić "% PATH%". To ostatnie ma wpływ na ładowanie bibliotek współdzielonych, czego nie ma 'jna.library.path'. – technomage

+0

Jeśli nazwa funkcji nie jest wymieniona na liście zależność zależności, JNA na pewno nie będzie w stanie go znaleźć. – technomage

+3

JNA można załadować z bibliotek DLL, które używają połączenia C. Klasa C# nie obsługuje domyślnie żadnego rodzaju powiązania C. C++ wspiera C-link z notacją "extern" C ". – technomage

Odpowiedz

4

Jak wspomniano przez technomage:

JNA można załadować z DLL, które korzystają z C wiązanie. Klasa C# nie jest domyślnie obsługiwana przez żadnego rodzaju powiązania C. C++ wspiera C-link z zewnętrzną notacją "C" .

This article pokazuje sposób, w jaki można wywoływać metody C# DLL, podobnie jak biblioteki DLL w stylu C, niestety jest to dość skomplikowane.

3

Ten Nugget jest bardzo łatwy w użyciu i działa idealnie. https://www.nuget.org/packages/UnmanagedExports

Potrzebujesz programu Visual Studio 2012 (ekspresowe). Po zainstalowaniu wystarczy dodać [RGiesecke.DllExport.DllExport] przed jakąkolwiek funkcją statyczną, którą chcesz wyeksportować. To jest to!

przykład:

C#

[RGiesecke.DllExport.DllExport] 
public static int YourFunction(string data) 
{ 
    /*Your code here*/ 
    return 1; 
} 

Java

Dodać import u góry:

import com.sun.jna.Native; 

Dodaj interfejs w swojej klasie. Jego Twój C# nazwa funkcji poprzedzone literą „I”:

public interface IYourFunction extends com.sun.jna.Library 
    { 
     public int YourFunction(String tStr); 
    }; 

Zadzwoń do DLL, gdzie jest to potrzebne w swojej klasie:

IYourFunction iYourFunction = (IYourFunction)Native.loadLibrary("full or relative path to DLL withouth the .dll extention", IYourFunction.class);//call JNA 
     System.out.println("Returned: " + IYourFunction.YourFunction("some parameter")); 
+2

Naprawdę? Spróbuję: D –

Powiązane problemy