У меня есть следующий метод C ++, скомпилированный с использованием Visual Studio 2017:
extern "C" __declspec( dllexport )
Info* __stdcall GetInfo(InfoProvider* infoProvider)
{
static_assert(std::is_pod<Info>::value, "Must be Plain Old Data in order to be safely copied between DLL boundaries");
Info info = new Info();
Info->data1 = infoProvider->data1;
Info->data2 = infoProvider->data2;
return info;
}
В коде Java он отображается в среде выполнения Java с использованием метода интерфейса со следующей сигнатурой:
Info GetInfo(Pointer infoProvider);
final class Info extends Struct {
public final Signed32 data1;
public final Signed32 data2;
public R2VInfo(final Runtime runtime) {
super(runtime);
data1 = new Signed32();
data2 = new Signed32();
}
}
Это работает.
Вышеупомянутый метод C ++ вызывает утечку памяти, поэтому я хотел бы изменить его, чтобы он возвращал результат по значению:
extern "C" __declspec( dllexport )
Info __stdcall GetInfo(InfoProvider* infoProvider)
{
static_assert(std::is_pod<Info>::value, "Must be Plain Old Data in order to be safely copied between DLL boundaries");
Info info{};
Info.data1 = infoProvider->data1;
Info.data2 = infoProvider->data2;
return info;
}
Я использую то же отображение Java JNR:
Info GetInfo(Pointer infoProvider);
Но это не работает - нарушение прав доступа.Вызывается собственный метод, но с некоторым изменяющимся значением указателя.
Как вернуть по значению в JNR?