Hi zusammen,
ich versuche gerdae eine DLL mit Cpp zu erstellen und die bei mir in mein Java-Prg via JNA einzubingen.
Dazu habe ich die DLL erstellt:
Header Library.h:
C++ Klasse Library.cpp:
Auf der Java-Seite habe ich ein Interface erstellt über welches ich die DLL laden will...
Dazu eine Testklasse:
diese hat folgende Ausgabe;
Scheinbar hat er hier Probleme mit der Übergabe des Strings, disen habe ich auch bereits versucht mittels Hilfsklasse als Pointer zu übergeben ohne Erfolg.
Hat jemand eine Idee ? Übergabe als chararray oder ähnliches ?
ich versuche gerdae eine DLL mit Cpp zu erstellen und die bei mir in mein Java-Prg via JNA einzubingen.
Dazu habe ich die DLL erstellt:
Header Library.h:
Code:
#pragma once
#include <string>
extern "C" __declspec(dllexport) int testMethodInt(int paraminput);
extern "C" __declspec(dllexport) std::string * testMethodString(std::string* paraminput);
C++ Klasse Library.cpp:
Code:
#include "pch.h" // use stdafx.h in Visual Studio 2017 and earlier
#include <string>
#include "Library.h"
#include <iostream>
int testMethodInt(int inputParam) {
int test = inputParam + 5;
return test;
}
std::string* testMethodString(std::string* inputParam) {
previous = previous + 1;
std::string test = "HALLO";
test = test + *inputParam;
return &test;
}
Auf der Java-Seite habe ich ein Interface erstellt über welches ich die DLL laden will...
Code:
import com.sun.jna.Callback;
import com.sun.jna.Native;
import com.sun.jna.ptr.ByteByReference;
import com.sun.jna.ptr.IntByReference;
import com.sun.jna.ptr.LongByReference;
import com.sun.jna.ptr.PointerByReference;
import com.sun.jna.ptr.ShortByReference;
import com.sun.jna.win32.StdCallLibrary;
public interface ICPPDLLTest extends StdCallLibrary{
ICPPDLLTest INSTANCE = (ICPPDLLTest) Native.load("absPath\\TestDLLCPP.dll"
, ICPPDLLTest.class);
public interface eventCallback extends Callback {
public void callback(int id);
}
int testMethodInt(int test);
String testMethodString(String test);
}
Dazu eine Testklasse:
Code:
public class CPPDLLTest {
public static void main(String[] args) {
ICPPDLLTest test = ICPPDLLTest.INSTANCE;
System.out.println("testMethodInt: " + test.testMethodInt(5));
System.out.println("testMethodInt: " + test.testMethodInt(11));
System.out.println("testMethodString: " + test.testMethodString("asd"));
System.out.println("testMethodString: " + test.testMethodString("asdXXX"));
}
}
diese hat folgende Ausgabe;
testMethodInt: 10
testMethodInt: 16
Exception in thread "main" java.lang.Error: Invalid memory access
at com.sun.jna.Native.invokePointer(Native Method)
at com.sun.jna.Function.invokePointer(Function.java:497)
at com.sun.jna.Function.invokeString(Function.java:660)
at com.sun.jna.Function.invoke(Function.java:434)
at com.sun.jna.Function.invoke(Function.java:361)
at com.sun.jna.Library$Handler.invoke(Library.java:265)
at com.sun.proxy.$Proxy0.testMethodString(Unknown Source)
at CPPDLLTest.main(CPPDLLTest.java:19)
Scheinbar hat er hier Probleme mit der Übergabe des Strings, disen habe ich auch bereits versucht mittels Hilfsklasse als Pointer zu übergeben ohne Erfolg.
Code:
public class StringByReference extends ByReference {
public StringByReference() {
this(0);
}
public StringByReference(int size) {
super(size < 4 ? 4 : size);
getPointer().clear(size < 4 ? 4 : size);
}
public StringByReference(String str) {
super(str.length() < 4 ? 4 : str.length() + 1);
setValue(str);
}
private void setValue(String str) {
getPointer().setString(0, str);
}
public String getValue() {
return getPointer().getString(0);
}
}
Hat jemand eine Idee ? Übergabe als chararray oder ähnliches ?