开发imageJ插件失败经验

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的安装文件复制出来试一下调用了那些库,但是最后放弃了,因为初衷已经不一样了。

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值