imageJ插件开发失败经验
我了解到的imageJ(java语言开发)的插件的开发方法有三个:
①编写c++程序,编译生成dll文件,然后通过java语言调用
②imageJ宏语言开发,算是imageJ的集成语言,调用imageJ的库
③java语言直接开发
网盘资料:(里面只有一个ij.jar以及一个imageJ的小部分中文教程,需要可以下载)
链接:https://pan.baidu.com/s/1JK4vvdLP76QqjOVQof0yfg
提取码:d94i
开发的思路
我实验的是第一种方法,也就是c++编译生成dll文件的那种,由于我所拥有的是matlab代码,要做成插件,然后在将matlab代码转成c++代码的时候发现太麻烦了,然后想走捷径,就想到了混合matlab与vs2019的混合编译,因为matlab也能生成dll文件,并且c++能够调用,并且在后续的实验中也发现了java程序也一样能够调用,但是结果就是能够实现,但是就是需要matlab的安装环境,也就是说需要安装matlab,不符合项目的要求,所以最后放弃了。
插件开发思路
创建一个class类(我使用的是Apache NetBeans IDE 12.4)
代码来自jni开发教程
创建一个Java工程
把它放在你的文件夹里面,然后添加一个类
输入以下代码
public class test_Plugin_four_ {
public static native String sayHello(String name);
public static void main(String[] args) {
System.load("F:\\310project\\HNwork\\plugin\\test_Plugin_four\\test_dll_four\\x64\\Debug\\test_dll_four.dll");
System.out.println("Strat to work");
String text = sayHello("xiaoming");
System.out.println(text);
}
其中加载dll库的句子可以先不加,不影响,主要是后面调用的。
记得修改以下类名称就行,保存
生成c++头文件
windows + r 然后输入cmd
然后进入到你创建的java文件的目录下
然后编译java程序
javac test_hello.java
再编译生成头文件:
javah -jni test_hello
注意不要后缀class
然后你的文件夹下面就会有c++的头文件了
创建c++ 项目
直接选空项目就行
右键源文件,添加一个c++文件
修改名称后确定
然后将刚刚生成的头文件复制到你创建的c++项目的文件夹下:
然后添加以下代码:
#include "test_hello.h"
#ifdef __cplusplus
extern "C"
{
#endif
/*
* Class: com_study_jnilearn_HelloWorld
* Method: sayHello
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_test_1hello_sayHello(
JNIEnv* env, jclass cls, jstring j_str)
{
const char* c_str = NULL;
char buff[128] = { 0 };
c_str = (*env).GetStringUTFChars(j_str, 0);
if (c_str == NULL)
{
printf("out of memory.\n");
return NULL;
}
(*env).ReleaseStringUTFChars(j_str, c_str);
printf("Java Str:%s\n", c_str);
// sprintf_s(buff, "hello %s", c_str);
printf("hello :%s\n", c_str);
return (*env).NewStringUTF("Hello,I am xiaoming");
}
#ifdef __cplusplus
}
#endif
然后你会发现一大堆错误,不要慌,我们首先将工程修改为x64工程,如下:
然后再右击项目,点击属性,进入到属性页面:
中间有个配置类型,修改为dll文件
再将java的环境添加进去,点击vc++目录,包含目录,添加你的java环境
按确认,应用然后错误就消失了,然后生成解决方案,你就会发现在你的c++项目的文件夹下就可以看见生成的dll文件了
然后复制路径,和名称,写入你的java程序里面
然后运行,出现
那么恭喜你,已经成功第一步了。完成了Java和c++的通信,接下来就是生成插件了。
生成imageJ插件
在imageJ的菜单栏的那一项,点击plugin里面,你会发现有一个new,里面提供有imageJ插件开发的例程,例程里面有三个选项,具体选哪个,我们可以根据自己的需求来,我们在这里选择的是有界面的
这个是官方提供的例程,我们加点控件啥的,如下,创建了三个控件,然后是点击step1 会加载我们生成的dll库,然后接收返回的值,作为log打印:
import static ij.IJ.log;
import static ij.IJ.showMessage;
import ij.process.*;
import ij.gui.*;
import java.awt.*;
import ij.plugin.frame.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import static javax.swing.JFrame.EXIT_ON_CLOSE;
import javax.swing.JLabel;
public class test_hello extends PlugInFrame{
Panel panel;
public static native String sayHello(String name);
public test_hello() {
super("test_Plugin_four_");
panel = new Panel();
panel.setLayout(new GridLayout(3,1,15,50));
Button btn1 = new Button("Step 1");
panel.add(btn1);
btn1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
System.load("F:\\test_hello\\test_hello_dell\\x64\\Debug\\test_hello_dell.dll");
log("star to work");
// System.load("D:\\fiji-win64\\Fiji.app\\test_dll_four.dll");
String text = sayHello("xiaoming");
log (text);
}
});
Button btn2 = new Button("Step 2");
panel.add(btn2);
Button btn3 = new Button("Step 3");
panel.add(btn3);
add(panel);
pack();
GUI.center(this);
setVisible(true);
}
}
当我们把代码加进去,会发现有很多错误,如下:
那是因为我们没有导入imageJ的包,当时为了尽快验证,所以就直接下了ij.jar文件然后导入就算了,没有进行太多的操作,懂的小伙伴可以自己试试。
将ij.jar放在目录下面:
然后在你的java项目下面添加进去就可以了
右击Libraries然后选着Add jar,然后选择你ij.jar放置的目录下就行了,
错误解决后,更改以下system.load()函数的路径就可以了。
然后如下:
就表明已经生成了插件,插件的位置在你的java目录下的dist文件里面:
将插件放入到你的imageJ的目录下的plugin里面就行了
接着打开你的imageJ,在plugin下面能找到你的插件的名字了,运行效果如下:
这样子插件就已经完成了,需要的话根据项目修改就可以了。
一些小知识
①网上的资料很多,其实真的也很杂,所以看到一个完整的教程不容易,所以需要不断的尝试。
②你创建的插件一定要带下划线_,你可以生成后再修改也行,但是这是imageJ里面规定的
③如果你的生成插件里面有package(java导包的语句),imageJ是不会识别到你的插件的,其实你按照流程走,不自己创建文件夹,是不需要要package语句的
④可以学习以下jni的相关知识,里面有很多包括native的一些说法,以及很多函数
最后
如果有大佬是做过我的那个方法的话,可以评论留下联系方式,我联系你,我讲一下我的那个思路和目前做到的步骤。
(想法:Java既然能够调用c++生成的dll文件,而vs2019和matlab也是可以混合编程的,那么理论上这种方法做的插件应该是可以的,但是事实上也是,但是需要依赖matlab的环境,也就是说在计算机的环境里面添加matlab
目前的步骤:Java调用没问题,插件也没问题,除了出不了matlab的窗口,但是可以调用matlab的引擎,但是还是那句话需要用到matlab的安装环境,其实尝试过将matlab的安装文件复制出来试一下调用了那些库,但是最后放弃了,因为初衷已经不一样了。
)