【java】这个JNI示例为什么用脚本可以运行,用Intellij就不行?
问题描述
我买了一个南京美乐威(Magewell)的USB HDMI采集棒。在win10下使用,官方说的是支持java的。也提供了一个示例。在这个示例里面的shell脚本可以实现编辑,并启动程序,但是用Intellij Idea,java可以编译,也能找到dll,但是会提示dll的dependent library出错。我这个IJ的环境应该怎么配?IJ和cmd shell在运行这个java程序的时候有什么区别,导致了我遇到的问题。
问题出现的环境背景及自己尝试过哪些方法
提供的SDK可以在这里下载到:(下载地址:https://www.magewell.com/down...)
下载之后安装路径:C:\MWCaptureSDK 3.3.1.1004\
安装之后修改环境变量PATH,添加SDK下的SDKv3\Bin\x64。
之后用vs编译了提供的VS项目
dll就能在刚才添加的path中找到了。
之后把examplejava导入intellij,导入的结果是三个module。
(左边可以看到)
直接运行需要的AVcapture2找不到dll,
修改vm的选项,添加
-Djava.library.path="${env_var:PATH};C:\MWCaptureSDK 3.3.1.1004\SDKv3\Bin\x64\Release"
找到了刚才编译的dll,又说这个dll依赖的东西找不到
运行时错误找不到依赖的library:
但是如果直接用script就可以,出现采集成功的小窗口。
相关代码
// 请把代码文本粘贴到下方(请勿用图片代替代码)
直白的buildscript
javac -d . ..\LibMWCapture\src\com\magewell\libmwcapture\*.java ..\AVCapture2Java\src\com\magewell\avcapture2\*.java -Xlint:deprecationjava com.magewell.avcapture2.AVCapture2
报错的地方
public class LibMWCapture {static {
try {
System.loadLibrary("LibMWCaptureJni");
}
catch(Exception e) {
String path = System.getProperty("java.class.path");
int firstIndex = path.lastIndexOf(System.getProperty("path.separator")) + 1;
int lastIndex = path.lastIndexOf(File.separator) + 1;
path = path.substring(firstIndex, lastIndex);
String jnipath=path+"LibMWCaptureJni.dll";
String mwcapturepath=path+"diLibMWCapture.dll";
String mediapath=path+"LibMWMedia.dll";
String jwatpath=path+"jawt.dll";
System.load(mwcapturepath);
System.load(mediapath);
System.load(jwatpath);
System.load(jnipath);
}
}
下面的省略....
你期待的结果是什么?实际看到的错误信息又是什么?
我就希望能够从IJ里运行看到那个小窗子。IJ和bat到底有什么区别。为什么bat可以,IJ就不行?
的确,从IJ中的启动的有些不正常:
打印了java.library.path
IJ中
脚本启动的
经过提醒,我用的path的格式确实不对,应该是
${PATH}
这样的话打印的时候就解析了
但是错误提示仍然是这样的。我检查了IJ的输出和cmd的输出的区别。有一些区别
我手工在java.library.path参数中补上了这两个,但是错误提示仍然是找不到dependent library
回答
好的,这个问题,在各位专家和南京Magewell客服的帮助下最后解决了,关键是IJ有Path变量管理的问题,具体的说,在Run->Edit Configuration下有个叫Enviromental Variables的选项,默认是空的,
点开可以看到Include system environment variables.
问题的答案就是这个东西不是即时同步的,哪怕是启动代码不同的jvm session也不是即时同步的。所以我需要改了path以后重启一下,把改好的系统变量同步进来。。。java这个一次编译到处调试还真是喵了个咪的。
以上是 【java】这个JNI示例为什么用脚本可以运行,用Intellij就不行? 的全部内容, 来源链接: utcz.com/a/75316.html