1. Итак напишим:
код Phonebook.java:

Код:
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;

public class Phonebook extends JFrame {

   public Phonebook() {
   }

   static {
      System.loadLibrary("phonebook");
   }
   private native void addPhone(String name, String phonenumber, String fax, String email);
   private native int getRecordsCount();  
   private native String getPhone(int id);

   public static void main(String[] args) {
      new Phonebook();
   }
}

2. Дадим команду javac -h . PhoneBook.java
3. Создадим пустой проект в Dev-C++
4. Вставим Phonebook.h:

Код:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Phonebook */

#ifndef _Included_Phonebook
#define _Included_Phonebook
#ifdef __cplusplus
extern "C" {
#endif
#undef Phonebook_FOCUS_TRAVERSABLE_UNKNOWN
#define Phonebook_FOCUS_TRAVERSABLE_UNKNOWN 0L
#undef Phonebook_FOCUS_TRAVERSABLE_DEFAULT
#define Phonebook_FOCUS_TRAVERSABLE_DEFAULT 1L
#undef Phonebook_FOCUS_TRAVERSABLE_SET
#define Phonebook_FOCUS_TRAVERSABLE_SET 2L
#undef Phonebook_TOP_ALIGNMENT
#define Phonebook_TOP_ALIGNMENT 0.0f
#undef Phonebook_CENTER_ALIGNMENT
#define Phonebook_CENTER_ALIGNMENT 0.5f
#undef Phonebook_BOTTOM_ALIGNMENT
#define Phonebook_BOTTOM_ALIGNMENT 1.0f
#undef Phonebook_LEFT_ALIGNMENT
#define Phonebook_LEFT_ALIGNMENT 0.0f
#undef Phonebook_RIGHT_ALIGNMENT
#define Phonebook_RIGHT_ALIGNMENT 1.0f
#undef Phonebook_serialVersionUID
#define Phonebook_serialVersionUID -7644114512714619750i64
#undef Phonebook_serialVersionUID
#define Phonebook_serialVersionUID 4613797578919906343i64
#undef Phonebook_INCLUDE_SELF
#define Phonebook_INCLUDE_SELF 1L
#undef Phonebook_SEARCH_HEAVYWEIGHTS
#define Phonebook_SEARCH_HEAVYWEIGHTS 1L
#undef Phonebook_OPENED
#define Phonebook_OPENED 1L
#undef Phonebook_serialVersionUID
#define Phonebook_serialVersionUID 4497834738069338734i64
#undef Phonebook_DEFAULT_CURSOR
#define Phonebook_DEFAULT_CURSOR 0L
#undef Phonebook_CROSSHAIR_CURSOR
#define Phonebook_CROSSHAIR_CURSOR 1L
#undef Phonebook_TEXT_CURSOR
#define Phonebook_TEXT_CURSOR 2L
#undef Phonebook_WAIT_CURSOR
#define Phonebook_WAIT_CURSOR 3L
#undef Phonebook_SW_RESIZE_CURSOR
#define Phonebook_SW_RESIZE_CURSOR 4L
#undef Phonebook_SE_RESIZE_CURSOR
#define Phonebook_SE_RESIZE_CURSOR 5L
#undef Phonebook_NW_RESIZE_CURSOR
#define Phonebook_NW_RESIZE_CURSOR 6L
#undef Phonebook_NE_RESIZE_CURSOR
#define Phonebook_NE_RESIZE_CURSOR 7L
#undef Phonebook_N_RESIZE_CURSOR
#define Phonebook_N_RESIZE_CURSOR 8L
#undef Phonebook_S_RESIZE_CURSOR
#define Phonebook_S_RESIZE_CURSOR 9L
#undef Phonebook_W_RESIZE_CURSOR
#define Phonebook_W_RESIZE_CURSOR 10L
#undef Phonebook_E_RESIZE_CURSOR
#define Phonebook_E_RESIZE_CURSOR 11L
#undef Phonebook_HAND_CURSOR
#define Phonebook_HAND_CURSOR 12L
#undef Phonebook_MOVE_CURSOR
#define Phonebook_MOVE_CURSOR 13L
#undef Phonebook_NORMAL
#define Phonebook_NORMAL 0L
#undef Phonebook_ICONIFIED
#define Phonebook_ICONIFIED 1L
#undef Phonebook_MAXIMIZED_HORIZ
#define Phonebook_MAXIMIZED_HORIZ 2L
#undef Phonebook_MAXIMIZED_VERT
#define Phonebook_MAXIMIZED_VERT 4L
#undef Phonebook_MAXIMIZED_BOTH
#define Phonebook_MAXIMIZED_BOTH 6L
#undef Phonebook_serialVersionUID
#define Phonebook_serialVersionUID 2673458971256075116i64
/*
 * Class:     Phonebook
 * Method:    addPhone
 * Signature: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_Phonebook_addPhone
  (JNIEnv *, jobject, jstring, jstring, jstring, jstring);

/*
 * Class:     Phonebook
 * Method:    getRecordsCount
 * Signature: ()I
 */
JNIEXPORT jint JNICALL Java_Phonebook_getRecordsCount
  (JNIEnv *, jobject);

/*
 * Class:     Phonebook
 * Method:    getPhone
 * Signature: (I)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_Phonebook_getPhone
  (JNIEnv *, jobject, jint);

#ifdef __cplusplus
}
#endif
#endif

5. Вставим в Phonebook.c:

Код:
#define FILENAME "phonebook.bin" // Имя файла, константа
#define MAX_SIZE_BUF sizeof(RECORD)         // Максимальный размера буфера, константа
#include <jni.h>
#include <stdio.h>
#include "Phonebook.h"

// Запись телефонной книжки
typedef struct {
	char name[512];    	// Имя фамилия
	char phonenumber[30];	// Номер телефона
	char fax[30];    	// Номер факса
	char email[40];    	// Эл.почта
} RECORD;

// Проверка существует ли файл
int file_exist() {
  FILE *f;
  f = fopen(FILENAME, "r+b");
  if(f == NULL) return -1;
  else { 
    fclose(f);
    return 0;
  }
}

//Добавляет запись
JNIEXPORT void JNICALL Java_Phonebook_addPhone(JNIEnv *env, jobject obj, jstring name, jstring phonenumber, jstring fax, jstring email) {
  FILE *f;
  RECORD rec;
  if(strlen((*env)->GetStringUTFChars(env, name, NULL)) > 512) return;
  if(strlen((*env)->GetStringUTFChars(env, phonenumber, NULL)) > 30) return;
  if(strlen((*env)->GetStringUTFChars(env, fax, NULL)) > 30) return;
  if(strlen((*env)->GetStringUTFChars(env, email, NULL)) > 40) return;
  
  f = fopen(FILENAME, "a+b");
  strcpy(rec.name, (*env)->GetStringUTFChars(env, name, NULL));
  strcpy(rec.phonenumber, (*env)->GetStringUTFChars(env, phonenumber, NULL));
  strcpy(rec.fax, (*env)->GetStringUTFChars(env, fax, NULL));
  strcpy(rec.email, (*env)->GetStringUTFChars(env, email, NULL));
  fwrite(&rec, sizeof(RECORD), 1, f);
  fclose(f);
}

//Читает запись
JNIEXPORT jstring JNICALL Java_Phonebook_getPhone(JNIEnv *env, jobject obj, jint recordid) {
  FILE *f;
  RECORD rec;
  int index=0;
  char buf[4096];
  f = fopen(FILENAME, "r+b");
  fseek(f, sizeof(RECORD)*recordid, SEEK_CUR);
  fread(&rec, sizeof(RECORD), 1, f);
  sprintf(buf, "%s~%s~%s~%s", rec.name, rec.phonenumber, rec.fax, rec.email);
  return (*env)->NewStringUTF(env, buf);
  fclose(f);
}

// Возвращает количество записей в телефонной книжки
JNIEXPORT jint JNICALL Java_Phonebook_getRecordsCount(JNIEnv *env, jobject obj) {
  FILE *f;
  RECORD rec;
  int max;
  char buf[MAX_SIZE_BUF+1];

  // Проверяем есть ли файл, если нет, то возвращаем пустое количество записи и создаём файл
  if(file_exist() == -1) {
    f = fopen(FILENAME, "w+b");
    fclose(f);
    return 0;
  }
  
  f = fopen(FILENAME, "r+b");
  fseek(f, 0L, SEEK_END);
  max  = ftell(f);
  fclose(f);
  return max/sizeof(RECORD);
}

6. Выберем что проект Dll.
7. Подредактируем форму "Новая запись", я буду делать это в Borland JBuilder 5.
https://i.ibb.co/NrNWHnW/java-field-01-47-01-02-2022-min.jpg

8. Добавим код в Phonebook.java:

Код:
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;

public class Phonebook extends JFrame {
   private JTable tblDemo = null;
   private DefaultTableModel tblModel = null;

   // Считывает данные из файла, и добавляет их в сетку
   private void GetItems() {
	   String[] arrColumns = {"ID", "Имя", "Телефон", "Факс", "Эл.почта"};
	   String str = "";
	   String arrdata[] = null;

       tblModel  = new DefaultTableModel(arrColumns, 0);
       tblDemo = new JTable(tblModel);
       add(new JScrollPane(tblDemo)); 
       for(int j=0; j<getRecordsCount(); j++) {
    str = getPhone(j);
    arrdata = str.split("~");
    tblModel.addRow(new Object[]{new Integer(j), arrdata[0], arrdata[1], arrdata[2], arrdata[3]});   
	   }
   }

   // Конструктор
   public Phonebook() {
     try {
       setTitle("Записная книжка");
       setSize(640, 480);
       setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

	   GetItems();
	   JMenuBar bar = new JMenuBar();
	   JMenu mnuFile = new JMenu("Файл");
	   JMenuItem popupNewRecord = new JMenuItem("Добавить новую запись");
	   popupNewRecord.addActionListener(new ActionListener() {
       public void actionPerformed(ActionEvent e){  
    	   JFrame frm = new JFrame();
    	   JLabel lbName = new JLabel("Имя:");
    	   JLabel lbPhone = new JLabel("Телефон:");
    	   JLabel lbFax = new JLabel("Факс:");
    	   JLabel lbEmail = new JLabel("Эл.почта:");
       JTextField txtName = new JTextField();
       JTextField txtPhone = new JTextField();
       JTextField txtFax = new JTextField();
       JTextField txtEmail = new JTextField();
    	   JButton btnOK = new JButton("Сохранить");
    	   JButton btnCancel = new JButton("Отменить");

  	
    	// lbName.setBounds(new Rectangle(15, 10, 45, 20));    	
    	lbName.setBounds(new Rectangle(15, 10, 75, 20));
    	txtName.setBounds(new Rectangle(15, 33, 372, 29));
    	//txtName.setMargin(new Insets(10, 10, 10, 10));
    	
    	// lbPhone.setBounds(new Rectangle(15, 82, 45, 20));
    	lbPhone.setBounds(new Rectangle(15, 82, 75, 20));
    	txtPhone.setBounds(new Rectangle(15, 101, 171, 29));

    	// lbFax.setBounds(new Rectangle(15, 143, 29, 20));
    	lbFax.setBounds(new Rectangle(15, 143, 75, 20));
    	txtFax.setBounds(new Rectangle(15, 162, 172, 29));
    
    	// lbEmail.setBounds(new Rectangle(15, 205, 42, 20));
    	lbEmail.setBounds(new Rectangle(15, 205, 75, 20));
    	txtEmail.setBounds(new Rectangle(15, 224, 367, 29));


    	// btnOK.setBounds(new Rectangle(9, 269, 92, 43));
    	btnOK.setBounds(new Rectangle(9, 269, 122, 43));
    	// btnCancel.setBounds(new Rectangle(102, 269, 92, 43));
    	btnCancel.setBounds(new Rectangle(142, 269, 92, 43));
    	
    	   frm.setTitle("Новая запись");
    	   frm.setSize(440, 450);
    	   frm.setLayout(null);
    	   frm.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    	   
    	   btnOK.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e){
        Object[] objOptions = { "Ок" };

    	if(txtName.getDocument().getLength() > 255 || txtPhone.getDocument().getLength() > 30 || txtFax.getDocument().getLength() > 30 || txtEmail.getDocument().getLength() > 40) {
        JOptionPane.showOptionDialog(null, "Слишком длинный текст!", "Ошибка",
        JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE,
        null, objOptions, objOptions[0]);
        return;
    	}
    	/*if(txtPhone.getText().getLength() > 30)
    	if(txtFax.getText().getLength() > 30)
    	if(txtEmail.getText().getLength() > 30)*/

        	addPhone(txtName.getText(), txtPhone.getText(), txtFax.getText(), txtEmail.getText());
        	getContentPane().remove(tblDemo);
        	GetItems();
        	getContentPane().repaint();
        	frm.dispose();
         }
    	   });

    	   btnCancel.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e){
        	frm.dispose();
         }
    	   });
    	   frm.add(lbName);
    	   frm.add(txtName);
    	   frm.add(lbPhone);
    	   frm.add(txtPhone);
    	   frm.add(lbFax);
    	   frm.add(txtFax);
    	   frm.add(lbEmail);
    	   frm.add(txtEmail);
    	   frm.add(btnOK);
    	   frm.add(btnCancel);
    	   frm.setVisible(true);
       }
	   });
	   mnuFile.add(popupNewRecord);
	   bar.add(mnuFile);
	   setJMenuBar(bar);
       setVisible(true);
     }
     catch(Exception ex) {
     }
   }

   static {
      System.loadLibrary("phonebook");
   }
   private native void addPhone(String name, String phonenumber, String fax, String email); // Добавить телефон
   private native int getRecordsCount();  // Получить количество записей из файла
   private native String getPhone(int id); // Считать определённу запись из файла

   public static void main(String[] args) {
      new Phonebook();
   }
}

9. Запускаем ещё раз компилятор:
javac -encoding utf8 Phonebook.java

10. Запускаем приложение java Phonebook
Результат:
https://i.ibb.co/gyS7w5d/phonebook-001-04-46-01-02-2022-min.jpg

Добавляем Anton Mustermann:
https://i.ibb.co/Fw0cj7d/phonebook-002-04-47-01-02-2022-min.jpg

Если сильно длинный текст, то выдаст предупреждение Слишком длинный текст:
https://i.ibb.co/jrBfRdG/phonebook-004-04-49-01-02-2022-min.jpg

Вуаля, Anton Mustermann сохранился:
https://i.ibb.co/3R4CQrG/phonebook-003-04-48-01-02-2022-min.jpg