Вот моя проблема.
У меня есть третья часть DLL (для которой у меня нет источника), с которой я должен использовать JNI для общения.Люди, которые поставляют эту DLL, не являются Java-домом.Я обнаружил ошибку в их DLL, поэтому написал несколько C ++, которые использовали их DLL, выявили ошибку и отправили их для исправления.Я, наконец, получил от них обновленную DLL, запустил свой код C ++ (который работал нормально) и обнаружил, что ошибка действительно была исправлена.
Однако теперь, когда я использую эту новую DLL внутри моего кода JNI, я получаюследующее исключение:
Exception c0000005, at 1EEE3416
Access violation: attempting to read memory at address 00000004
Native function stack data: 0,3f49c0,20201,801c6,65637845,6f697470,3063206e,30303030
com.jniwrapper.FunctionExecutionException: c0000005
at com.jniwrapper.Function.invokeCFunc(Native Method)
at com.jniwrapper.FunctionCall.a(SourceFile:127)
at com.jniwrapper.FunctionCall.call(SourceFile:35)
at com.jniwrapper.Function.invoke(SourceFile:188)
at com.tme.techdoc3.diagnostic.api.denso.DensoApiInvoker.invoke(DensoApiInvoker.java:78)
at com.tme.techdoc3.diagnostic.api.denso.NewDensoApi.invoke(NewDensoApi.java:106)
at com.tme.techdoc3.diagnostic.api.denso.NewDensoApi.connect(NewDensoApi.java:46)
at ConsoleApiRunner.main(ConsoleApiRunner.java:59)
Я на самом деле использую JNIWrapper для предоставления своего кода JNI и, таким образом, чтобы исключить их продукт как вызывающий проблему, вместо этого я написал свой собственный код JNI;но я все еще получаю эту же ошибку.Это убеждает меня в том, что проблема в сторонней DLL.
Я получаю это исключение из самой первой функции, которую я вызываю в DLL (кстати, в этой функции не было ошибки ...).
Место, откуда мы получаем DLL, прямо заявило, что они не будут поддерживать ее использование в среде JNI, даже если они не будут отправлять мне какие-либо заметки о выпуске или список изменений междуфиксированные и нефиксированные библиотеки DLL.
Политически я ничего не могу с этим поделать.Практически, я ограничен этим поставщиком для DLL.
Может кто-нибудь придумать причину, по которой эта DLL будет работать при вызове из C ++, а не при вызове из JNI?Я играл с размером стека JNI (-Xss) и некоторыми другими параметрами JVM, но я либо еще не выбрал правильные настройки, либо смотрю не на ту вещь.
Любые идеис благодарностью.
Большое спасибо.
РЕДАКТИРОВАТЬ: Добавление в мой собственный код JNI, чтобы увидеть, если кто-то может обнаружить ошибку.
РЕДАКТИРОВАТЬ 2: Исправленный код copy-n-paste error.
Когда я использую свой собственный код JNI, вот реализация файла .cpp, который я использую;
#include "stdafx.h"
#include "windows.h"
#include "MyJniApi.h"
#include "ThirdParty.h"
#pragma comment(lib, "ThirdParty.lib");
ThirdPartyThing* thirdParty;
JNIEXPORT jlong JNICALL Java_com_mycompany_jni_MyJniApi_connect(JNIEnv *, jobject) {
long connId = 0L;
thirdParty = new ThirdPartyThing();
long retval = thirdParty->GetConnection(&connId);
if(0 == retval) {
return connId;
} else {
return retval;
}
}
Как вы можете видеть, это довольно просто, и яя не вижу там места, когда я перепутал мои указатели и т.д.(Отказ от ответственности: это в значительной степени сумма моих навыков C ++!)