主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

使用结构体数组创建 Java 电话簿应用程序

R2026a

在此示例中,您将创建一个 Java® 包,该包调用 MATLAB® 函数来修改结构体数组并实现电话簿应用程序。

文件

MATLAB 函数makephone.m
MATLAB 函数位置matlabroot\toolbox\javabuilder\Examples\PhoneExample\PhoneDemoComp\
Java 代码位置matlabroot\toolbox\javabuilder\Examples\PhoneExample\PhoneDemoJavaApp\getphone.java

过程

  1. 将 MATLAB 附带的 PhoneExample 文件夹复制到您的工作文件夹:

    copyfile(fullfile(matlabroot,'toolbox','javabuilder','Examples','PhoneExample'),'PhoneExample')

    在 MATLAB 命令提示符下,导航到工作文件夹中的新 PhoneExample\PhoneDemoComp 子文件夹。

  2. 检查 makephone.m 函数。

    function book = makephone(friends)
    book = friends;
    for i = 1:numel(friends)
        numberStr = num2str(book(i).phone);
        book(i).external = ['(508) 555-' numberStr];
    end

    该函数将结构体数组作为输入,对其进行修改,并将修改后的数组作为输出。

  3. 使用以下信息构建 Java 包,可通过 Java 包编译器应用或 compiler.build.javaPackage 进行操作:

    字段值
    Java 包名称phonebookdemo
    类名phonebook
    要编译的文件makephone.m

    例如,如果您使用的是 compiler.build.javaPackage,请输入:

    buildResults = compiler.build.javaPackage('makephone.m', ...
    'PackageName','phonebookdemo', ...
    'ClassName','phonebook');

    有关详细信息,请参阅生成 Java 包并编译 Java 应用程序中的说明。

  4. 为访问 MATLAB 函数的应用程序编写源代码。

    此示例的示例应用程序位于 PhoneExample\PhoneDemoJavaApp\getphone.java 中。

    /* Necessary package imports */
    import com.mathworks.toolbox.javabuilder.*;
    
    import phonebookdemo.*;
    
    /*
     * getphone class demonstrates the use of the MWStructArray class
     */
    class getphone
    {
        public static void main(String[] args)
        {
            phonebook thePhonebook = null;     /* Stores magic class instance */
            MWStructArray friends = null; /* Sample input data */
            Object[] result = null;    /* Stores the result */
            MWStructArray book = null; /* Output data extracted from result */
            
            try
            {
                /* Create new magic object */
                thePhonebook = new phonebook();
                
                /* Create an MWStructArray with two fields */
                String[] myFieldNames = {"name", "phone"};
                friends = new MWStructArray(2,2,myFieldNames);
                
                /* Populate struct with some sample data --- friends and phone numbers */
                friends.set("name",1,new MWCharArray("Jordan Robert"));
                friends.set("phone",1,3386);
                friends.set("name",2,new MWCharArray("Mary Smith"));
                friends.set("phone",2,3912);
                friends.set("name",3,new MWCharArray("Stacy Flora"));
                friends.set("phone",3,3238);
                friends.set("name",4,new MWCharArray("Harry Alpert"));
                friends.set("phone",4,3077);
                
                /* Show some of the sample data */
                System.out.println("Friends: ");
                System.out.println(friends.toString());
                
                /* Pass it to a MATLAB function that determines external phone number */
                result = thePhonebook.makephone(1, friends);
                book = (MWStructArray)result[0];
                System.out.println("Result: ");
                System.out.println(book.toString());
                
                /* Extract some data from the returned structure */
                System.out.println("Result record 2:");
                System.out.println(book.getField("name",2));
                System.out.println(book.getField("phone",2));
                System.out.println(book.getField("external",2));
                
                /* Print the entire result structure using the helper function below */
                System.out.println("");
                System.out.println("Entire structure:");
                dispStruct(book);
            }
            catch (Exception e)
            {
                System.out.println("Exception: " + e.toString());
            }
            
            finally
            {
                /* Free native resources */
                MWArray.disposeArray(result);
                MWArray.disposeArray(friends);
                MWArray.disposeArray(book);
                if (thePhonebook != null)
                    thePhonebook.dispose();
            }
        }
        
        public static void dispStruct(MWStructArray arr) {
        	System.out.println("Number of Elements: " + arr.numberOfElements());
        	//int numDims = arr.numberOfDimensions();
        	int[] dims = arr.getDimensions();
        	System.out.print("Dimensions: " + dims[0]);
        	for (int i = 1; i < dims.length; i++)
        	{
        		System.out.print("-by-" + dims[i]);
        	}
        	System.out.println("");
        	System.out.println("Number of Fields: " + arr.numberOfFields());
        	System.out.println("Standard MATLAB view:");
        	System.out.println(arr.toString());
        	System.out.println("Walking structure:");
            java.lang.String[] fieldNames = arr.fieldNames();
            for (int element = 1; element <= arr.numberOfElements(); element++) {
                System.out.println("Element " + element);
                for (int field = 0; field < arr.numberOfFields(); field++) {
                	MWArray fieldVal = arr.getField(fieldNames[field], element);
                	/* Recursively print substructures, give string display of other classes */
                	if (fieldVal instanceof MWStructArray)
                	{
                    	System.out.println("   " + fieldNames[field] + ": nested structure:");
                    	System.out.println("+++ Begin of \"" + 
                                                  fieldNames[field] + "\" nested structure");
                		dispStruct((MWStructArray)fieldVal);
                    	System.out.println("+++ End of \"" + fieldNames[field] +
                                                                      "\" nested structure");
                	} else {
                    	System.out.print("   " + fieldNames[field] + ": ");
                        System.out.println(fieldVal.toString());          		
                	}
                }
            }
        }
    }

    程序执行以下操作:

    • 创建一个结构体数组,使用 MWStructArray 来表示示例电话簿数据。

    • 将绘图仪类实例化为 thePhonebook 对象:

      thePhonebook = new phonebook();

    • 调用 makephone 方法通过添加附加字段来创建结构的修改副本:

      result = thePhonebook.makephone(1, friends);

    • 使用 try-catch 模块来捕获并处理任何异常。

  5. 在 MATLAB 中,导航到 PhoneExample\PhoneDemoJavaApp 文件夹。

  6. 将生成的 phonebookdemo.jar 包复制到此文件夹中。

    例如,如果您使用了 compiler.build.javaPackage,请输入:

    copyfile(fullfile('..','PhoneDemoComp','phonebookdemojavaPackage','phonebookdemo.jar'))
  7. 在命令提示符窗口中,cd 到 PhoneDemoJavaApp 文件夹。

  8. 使用 getphone 编译 javac 应用程序。

    • 在 Windows® 上,键入:

      javac -classpath "matlabroot\toolbox\javabuilder\jar\javabuilder.jar";.\phonebookdemo.jar getphone.java
    • 在 UNIX® 上,键入:

      javac -classpath "matlabroot/toolbox/javabuilder/jar/javabuilder.jar":./phonebookdemo.jar getphone.java

    将 matlabroot 替换为 MATLAB 或 MATLAB Runtime 安装文件夹的路径。例如,对于 Linux®,路径可能是 /usr/local/MATLAB/R2026a。

  9. 运行 getphone 应用程序。

    • 在 Windows 上,键入:

      java -classpath .;"matlabroot\toolbox\javabuilder\jar\javabuilder.jar";.\phonebookdemo.jar getphone
    • 在 UNIX 上,键入:

      java -classpath .:"matlabroot/toolbox/javabuilder/jar/javabuilder.jar":./phonebookdemo.jar getphone

      注意

      如果您在 Mac 64 位平台上运行该应用程序,则必须在 Java 命令中添加 -d64 标志。

    getphone 程序显示以下输出:

    Friends: 
    2x2 struct array with fields:
        name
        phone
    Result: 
    2x2 struct array with fields:
        name
        phone
        external
    Result record 2:
    Mary Smith
    3912
    (508) 555-3912
    
    Entire structure:
    Number of Elements: 4
    Dimensions: 2-by-2
    Number of Fields: 3
    Standard MATLAB view:
    2x2 struct array with fields:
        name
        phone
        external
    Walking structure:
    Element 1
       name: Jordan Robert
       phone: 3386
       external: (508) 555-3386
    Element 2
       name: Mary Smith
       phone: 3912
       external: (508) 555-3912
    Element 3
       name: Stacy Flora
       phone: 3238
       external: (508) 555-3238
    Element 4
       name: Harry Alpert
       phone: 3077
       external: (508) 555-3077
    

另请参阅

|

主题