我正在尝试将Java应用程序嵌入到本机Mac应用程序中。Java应用程序是用jlink(Java 9)打包的,其中包括一个精简的JRE。
我试图使用Java调用接口创建JVM并启动主类,但程序在调用JNI\U CreateJavaVM时崩溃,因为它找不到libjava。动态库。
在我的Xcode项目中,我有一个“复制文件”阶段,该阶段将整个jlink映像(包含bin、lib等目录的文件夹)复制到应用程序包中的目录中。
$ ls -l Java\ Native\ Wrapper.app/Contents/image/
total 8
drwxr-xr-x 11 ahs staff 352 Jan 13 12:46 bin
drwxr-xr-x 6 ahs staff 192 Jan 13 12:46 conf
drwxr-xr-x 25 ahs staff 800 Jan 13 12:46 legal
drwxr-xr-x 52 ahs staff 1664 Jan 13 12:46 lib
-rw-r--r-- 1 ahs staff 717 Jan 13 12:46 release
dylib文件在那里:
$ file Java\ Native\ Wrapper.app/Contents/image/lib/libjava.dylib
Java Native Wrapper.app/Contents/image/lib/libjava.dylib: Mach-O 64-bit dynamically linked shared library x86_64
我的Objective-C代码链接到了lib/jli/libjli中的JNI库。动态库。Xcode会自动将其复制到应用程序包的Frameworks目录中。
当我运行程序时,我在控制台上收到以下错误:
Error: could not find libjava.dylib
Failed to GetJREPath()
我将image/lib
目录添加到运行时搜索路径中。使用otool
检查二进制文件确认它:
$ otool -l Java\ Native\ Wrapper
...
Load command 18
cmd LC_RPATH
cmdsize 48
path @executable_path/../Frameworks (offset 12)
Load command 19
cmd LC_RPATH
cmdsize 48
path @executable_path/../image/lib (offset 12)
...
我真的被难住了。我尝试过将dylib复制到框架目录,但没有成功。
我做错了什么?
它应该可以正常工作。如果我创建特定于用户的变量-JAVA\u HOME(
user-Defined Settings
),并将其设置为指向基于JAVA版本的jlink。
<代码>JAVA\u主页
:<代码>$(主页)/tmp/jdk-13-stripped
然后,我确保添加:$(JAVA_HOME)/jdk-13-stried/lib
作为资源(它最终会在最终应用程序的Resources
目录中),然后,我设置了以下设置:
Run Search Paths: @executable_path/../Resources/lib/server
Header Search Paths: $(JAVA_HOME)/include and $(JAVA_HOME)/include/darwin
Library Search Paths: $(JAVA_HOME)/lib/server
Other Linker Flags: -L$(JAVA_HOME)/lib/server -ljvm
然后,我运行代码
> ./CallJVM
Hello from Java
如果我检查加载了哪个图像,它是从正确的位置拍摄的
> lldb CallJVM
(lldb) image list
...
...
[ 7] .... .../Debug/CallJVM.app/Contents/Resources/lib/server/libjvm.dylib
使现代化
如果有人需要与此主题相关的视频教程,请看:在macOS应用程序包中嵌入JVM(使用XCode)
为缓解 Windows 下路径名过长的 问题, 略微加快一下 require的速度以及隐藏你的源代码,你可以选择把你的应用打包成 asar档案文件,这只需要对你的源代码做一些很小的改动。 大部分用户可以毫不费力地使用这个功能,因为它electron-packager,、electron-forge和electron-builder中都得到了支持,开箱即用。 如果你没有使用这些工具中的任何一个,那么
我正在将一个应用程序从Oracle Java8迁移到openJDK11+OpenJFX11。在Java8版本中,我使用以下代码加载了一个属性文件(CryoStats是包含代码的类): 在我的Netbeans构建配置中,我有一个任务,将“config”文件夹复制到“dist”文件夹,因此其中包括:我的jar文件、一个“lib”文件夹、一个“config”文件夹。这段代码在Netbeans内部和运行时
问题内容: 我的目标是让Limewire(JAVA)和Songbird(XULRunner)一起运行。 我当时想最好的方法是在JAVA摆动面板中运行XUL应用程序(songbird)。还有另一种方法吗? 将GUI完全放在XUL中,然后以某种方式访问我的JAVA对象会更好还是可行? 我将如何去做呢? 谢谢 问题答案: 看一看JRex,它可能会让您窥探到两个想法。 除此之外,我还将研究Rhinoh
问题内容: 我正在寻找一种将Google JavaScript引擎V8嵌入我的Java应用程序中的解决方案。 你有解决办法吗? 问题答案: 您可以使用J2V8 https://github.com/eclipsesource/J2V8。它甚至可以在Maven Central中使用 。 以下是您好,世界!使用J2V8的程序。 您将需要在pom.xml中指定平台。J2V8当前支持win32_x86,m
我有一个很大的swing应用程序,我想把javafx嵌入其中。我多次尝试这样做(通过遵循oracle教程等),但只有在声明一个新的JFrame以使用JFXPanel组件时才成功。但是,我不想使用新的框架,我想将我的Javafx代码合并到swing应用程序的根JFrame中。 我们可以将javaFX组件嵌入到JPanel而不是JFrame中吗?如果答案是肯定的,为什么我没有成功?
问题内容: 我将python解释器嵌入到多线程C应用程序中,对于应该使用哪些API来确保线程安全,我有些困惑。 从我收集到的信息来看,嵌入python时,在调用任何其他Python C API调用之前,由嵌入器负责GIL锁定。这是通过以下功能完成的: 但是,仅此一项似乎还不够。我仍然遇到随机崩溃,因为它似乎并未为Python API提供互斥。 阅读更多文档后,我还添加了: 在致电之后,但这就是令人