#java #c# #dll #ikvm
#java #c# #dll #ikvm
Вопрос:
Я работаю с некоторым Java-кодом, который загружает неуправляемую dll, так же, как следующее:
public void Foo(){
System.loadLibrary("absolute_path_to_my_dll.dll")
}
Он отлично работает из eclipse или консоли.
Следующий шаг: я использую инструменты IKVM для получения управляемой dll из моего java-приложения (ikvmc.exe ). Все работает нормально, и моя dll собрана идеально. Фактически, я импортировал эту библиотеку в тестовое решение (и добавил все необходимые ссылки IKVM — IKVM.Core.JDK, IKVM.Runtime.JNI и т. Д.-).
Ну, вот в чем проблема: когда я запускаю код C #, java-вызов System.LoadLibrary(…) завершается с ошибкой, и я получаю сообщение «UnsatisfiedLinkError: не удается загрузить absolute_path_to_my_dll.dll «. Абсолютный путь в порядке, и dll есть.
Любая помощь? Заранее спасибо.
Редактировать 1
Я постараюсь объяснить более подробно:
Шаг Java
public void Foo(){
System.loadLibrary("absolute_path_to_my_dll.dll")
}
Если путь неверен, этот вызов выдает «UnsatisfiedLinkError», упомянутый выше. Это не так, все работает хорошо. Файл dll является 32-разрядным, поэтому я скомпилировал этот java-проект с помощью jre7 x86 (в 64-разрядном режиме LoadLibrary вызывает falis, очевидно, говоря, что мы не можем загрузить 32-разрядную dll на 64-разрядной машине AMD).
Шаг Ikvm
Теперь я компилирую java-код в управляемой dll, которую можно импортировать в проект .net. Прежде всего, я экспортирую свой java-проект в файл jar, «myJar.jar «. Затем я применяю ikvmc.exe чтобы сгенерировать управляемую библиотеку dll, скажем «myNewDll.dll «.
ikvm.exe -цель: библиотека -выход: «myNewDll.dll » «myJar.jar «
Этот шаг работает хорошо, и я получаю новую dll, которую я могу импортировать в свой проект VS.
Шаг C #
Теперь я создаю новое решение VS tester. Я добавляю «myNewDll.dll » в качестве ссылки, чтобы я мог использовать его в своем коде на C #. Кроме того, я добавляю IKVM.Core.Ссылка на JDK (если нет, проект не может быть скомпилирован) и настройте проект в 32-битном режиме. Проблемы начинаются здесь:
- Запуск этой настройки выдает «IKVM.Runtime.Ошибка JNI «. Я добавил эту ссылку.
- Повторный запуск выдает «не удается найти ikvm-native». Поскольку я не могу добавить ikvm-native-win32-x86.dll или ikvm-native-win32-x64.dll в качестве ссылки я помещаю их оба в выходной путь (bin / Debug).
- Следующая попытка выдает «UnsatisfiedLinkError: не удается загрузить xxx.dll «.
Как это может быть возможно, если эта dll загружается безупречно на этапе Java?
Еще одна попытка
Перед тем, как начать плакать, я попробовал другой способ: я создал основную программу Java, которая вызывала только Foo() . Затем я сгенерировал исполняемый файл с ikvmc.exe инструмент и вызвал его в консоли Windows. Это дало мне ту же ошибку, UnsatisfiedLinkError, так что, возможно, это ikvmc.exe проблема, но я не могу понять почему.
Есть идеи?
Правка 2
Хорошие новости. Кажется, я решил проблему. Прежде всего, мне пришлось добавить -platform:x86 для ikvmc.exe вызов (шаг 2). Сгенерированная dll была успешно импортирована в мой проект C #, и она отлично работает, если мы запускаем в режиме выполнения (НЕ отладки). Если я попытаюсь выполнить отладку в VS, это даст мне System.Runtime.Службы взаимодействия.Исключение SEHException.
Есть ли какая-либо ошибка, связанная с отладкой собственного кода (dll, загруженного в java-код) в машинном коде (который Java-код загружается в C # с использованием ikvm)?
Комментарии:
1. Есть ли у вас трассировка стека из вызова LoadLibrary?
2. У вас также есть dll ikvm-native-win32-x86.dll ?
Ответ №1:
Является ли ваша dll 32-разрядной и вы запускаете ее на 64-разрядной платформе?
Если да, то проблема в том, что IKVM не зависит от платформы. Это означает, что в 64-разрядной системе выполняется 64-разрядный процесс.
Для решения этой проблемы вам нужна 64-разрядная версия вашей dll или mark ikvm.exe как 32-битный процесс.
Комментарии:
1. Я настроил все в 32-разрядном: DLL, вызываемая в программе Java, dll, созданная с помощью IKVM, и решение VS, вызывающее эту dll. Я не использую ikvm.exe поскольку я импортирую dll в пользовательское решение.
2. Затем напишите больше деталей. Смотрите мой вопрос выше.
3. Да, я поставил ikvm-native-win32-x86.dll в пути. До этого ошибка была «не удается найти ikvm-native». Ошибка была сгенерирована IKVM.Core.JDK.dll . Я вставлю ошибку stacktrace завтра. Кажется, что IKVM.Runtime. JNI не может найти неуправляемую dll, хотя путь к dll правильный и системный. Вызов Load из java работает хорошо.
Ответ №2:
Добавление опции ссылки на IKVM.OpenJDK.Core.dll в каталоге ikvm /bin ошибка будет устранена.
Возможно, файлу .jar нужны какие-то собственные библиотеки DLL, которые совпадали с параметром расположения собственной библиотеки в JAR в Eclipse. Если это так, найдите собственные библиотеки DLL и скопируйте их в каталог de / bin IKVM и сделайте ikvmc для их автоматической загрузки.
Это все, что я узнал. Попробуйте и посмотрите, принесет ли это какие-то идеи.