пути поиска, где одна нативная библиотека зависит от другой

StackOverflow https://stackoverflow.com/questions/2511022

  •  22-09-2019
  •  | 
  •  

Вопрос

Я использую JNA и Java, но думаю, что этот вопрос влияет на любой мост «родной-неродной».

У меня есть приложение Java, которое использует lib1.dylib, а lib1.dylib использует lib2.dylib.

Я хочу поместить все в свой файл .app на Mac.Я могу легко поместить внутрь lib1.dylib и установить java.classpath (или NativeLibrary.addSearchPath()), чтобы сообщить JVM, где найти lib1.dylib.Проблема в том, что я не знаю, как сообщить, что зависимости lib1.dylib также находятся в указанном мной месте.В результате библиотека lib1 загружается нормально, но библиотека lib2 не может быть найдена, поскольку ее нет в пути к библиотеке операционной системы.

Кто-нибудь знает, как я могу преодолеть эту проблему?Я полагаю, что этого должно быть много в больших проектах с большим количеством общих библиотек.

Это было полезно?

Решение

Я сталкивался с этой проблемой раньше, и я только что столкнулся с ней сегодня. Вы можете обойти это, добавив аргумент VM «-djava.library.path =/path/to/orthy/libs», но я, кажется, помню, как Java использует это только для поиска интенсивной библиотеки, а затем использует Системный путь, чтобы искать любые зависимости.

Несколько решений, которые я пробовал раньше:

1) Используйте System.load (AbsolutePath) в зависимой библиотеке перед загрузкой вашей библиотеки. Хотя не делает вашу программу ультрафизированной, хотя, если вы не всегда знаете, где будет эта библиотека.

2) В случае, когда LIB1 зависит от LIB2, я фактически использовал SetCurrentDirectory (Windows, не уверенные в эквиваленте MAC) в нативном коде, прежде чем он будет связан с любым из зависимых LIB, и это, казалось, сработало. Опять же, требуется знать, где находятся другие libs.

3) В Windows может сбросить зависимые библиотеки в C: Windows System32, и он их находит.

Несколько полезных постов по аналогичной теме (специфичная для Windows, но я думаю, что проблема такая же):

http://www.realityInteractive.com/rgrzywinski/archives/000219.html http://www.velocityreviews.com/forums/t387618-jni-library-path.html

Другие советы

Я нашел решение для MacOSX, основанное на идее (2) от Stew:

Используя JarBundler для Mac (или одноименную задачу Ant), установите для переменной рабочего каталога значение $JAVAROOT и убедитесь, что ваши библиотеки dylib находятся в части Contents/Resources/Java файла .app.Если вы сделаете это, динамический компоновщик найдет все библиотеки зависимостей, поскольку это будет текущий каталог.Java также найдет исходную библиотеку dylib (тот, который имеет все зависимости) по той же причине.

Код муравья:

<target name="package_mac_app" depends="package_jar, compile_native" description="bundle the runnable jar into a Mac Application -- requires JarBundler ANT Task">
    <taskdef name="jarbundler" classname="net.sourceforge.jarbundler.JarBundler"/>
    <echo message="CREATING MAC .app EXECUTABLE"/>
    <jarbundler dir="${dist}"
      name="${appname}"
      mainclass="myPackage.myMainClass"
      icon="${icon_location}"
      jvmversion="1.5+"
      infostring="${appname}"
      shortname="${appshortname}"
      bundleid="${com.mycompany.mydepartment.myprogram}"
      jar="${run_jar_location}"
      workingdirectory="$JAVAROOT">
      <javafilelist dir="${dylib_location}" files="my-lib.dylib"/>
      <javafilelist dir="${dylib_location}" files="dependent-lib.dylib"/>
    </jarbundler>

</target>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top