35418

Java Lib

Лабораторная работа

Информатика, кибернетика и программирование

Научиться запаковывать свои классы в исполняемые jar файлы. Получить практические навыки по использованию сторонних библиотек в виде jar файлов. Изучить технологию JNI и научиться связываться с DLL написанными на С\С++

Русский

2013-09-10

50.52 KB

10 чел.

МИНИСТЕРСТВО ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ

УО “Полоцкий Государственный Университет”

Факультет Информационных технологий

Отчет
по лабораторной работе №3.2
по курсу “Операционные системы и системное программирование”

«Java Lib»

Выполнил                  студент группы 10-ИТ-1

Шоломицкий В.О.

Проверил           Тычина С. Г.

Полоцк, 2013

Цель работы.

Научиться запаковывать свои классы в исполняемые jar файлы. Получить практические навыки по использованию сторонних библиотек в виде jar файлов. Изучить технологию JNI и научиться связываться с DLL написанными на С\С++.

Задание.

  1.  Взять результирующую программу написанную на лабораторной работе №1. И реализовать все ввод параметров через native метод (строки с выводом передаются в методе);
  2.  Реализовать все метод алгоритма как native и вызвать в нем метод с алгоритмом в java;
  3.  В реализации native методов генерировать исключения и обрабатывать их в java программе;
  4.  Реализовать класс и DLL обертку для вызова функции (и всех сопутствующих, к примеру для получения HWND) из таблицы 3 согласно варианту из Win32 API;
  5.  Запаковать класс обертку в отдельный jar файл, с манифестом, и с версиями;
  6.  Запечатать пакет в созданном в пункте 5 jar файле
  7.  Запустить свою программу с вызовом метода из jar сделанной в пункте 4 - 5.
  8.  Запаковать свою программу в jar файл со всеми требуемыми ресурсами, DLL, оберткой jar.Запустить программу в виде jar файла;
  9.  Запаковать программу как в пункте 7, но без оберткой jar. Запустить программу в виде jar файла.
  10.  Реализовать отдельно программу которая будет загружать ваш jar созданный в    пункте 9.

Вариант – EnumWindow();

Задание 1

Взять программу, написанную на лабораторной работе №1. И реализовать весь ввод параметров через native метод (строки с выводом передаются в методе);

package lab2.ex1;

import java.util.*;

 

public class test{

  private native double scan();

  static{

     System.load("C:\\Users\\origin\\Desktop\\2\\ex1.dll");

  }

   public static void main(String[] args) {

    Scanner con = new Scanner(System.in);

       test t = new test();

       int l = -1;

       

while(l!=0){

       double x = t.scan();

       

       if(x<=0)System.out.println("result : -1");

       if((x>0)&(x<2))System.out.println("result : "+x*x);

       if(x>=2)System.out.println("result : 4");

 

       System.out.println("Continie? (0 - exit)");

       l = con.nextInt();

}

   }     

   }

Листинг ex1.cpp:

#include "stdafx.h"

#include "lab2_ex1_test.h"

JNIEXPORT jdouble JNICALL Java_lab2_ex1_test_scan (JNIEnv *env, jobject)

{

printf("(From DLL) Input x : ");

 double d = 0;

scanf_s("%lf",&d);

 return d;

}

Задание 2 - Реализовать все метод алгоритма как native и вызвать в нем метод с алгоритмом в java;

package lab2.ex2;

import java.util.*;

 

public class test{

  private native void Func();

  static{

     System.load("C:\\Users\\origin\\Desktop\\2\\ex2.dll");

  }

   public static void main(String[] args) {

    Scanner con = new Scanner(System.in);

       test t = new test();

       int l = -1;

       

while(l!=0){

    t.Func();

       System.out.println("\nContinie? (0 - exit)");

       l = con.nextInt();

}

   }

       

   }

Листинг ex2.cpp:

#include "stdafx.h"

#include "lab2_ex2_test.h"

JNIEXPORT void JNICALL Java_lab2_ex2_test_Func (JNIEnv *env, jobject)

{

printf("(From DLL(2)) Input x : ");

 double d = 0;

scanf_s("%lf",&d);

 if(d<=0) printf("result : -1");

   if((d>0)&(d<2)) printf("result : %.2lf",d*d);

   if(d>=2) printf("result : 4");

}

Задание 3 - В реализации native методов генерировать исключения и обрабатывать их в java программе;

package lab2.ex3;

import java.util.*;

 

public class test{

 private native void Exc() throws Exception;

  static{

     System.load("C:\\Users\\origin\\Desktop\\2\\ex3.dll");

  }

   public static void main(String[] args) throws Exception {

    Scanner con = new Scanner(System.in);

       

try{

    test t = new test();

    t.Exc();

    System.out.println("--");

 }

 catch(OutOfMemoryError e)

 {

 System.out.println("\n-----------------------------------------");

 System.out.println(e);

 System.out.println("-----------------------------------------");

 }

   }

   }

Листинг ex3.cpp

#include "stdafx.h"

#include "lab2_ex3_test.h"

JNIEXPORT void JNICALL Java_lab2_ex3_test_Exc (JNIEnv *pEnv, jobject){

 jclass clazz = pEnv->FindClass("java/lang/OutOfMemoryError");

 if (clazz) pEnv->ThrowNew(clazz,"Error from c++");

 pEnv->DeleteLocalRef(clazz);

}

Задание 4 - Реализуем java-программу, в которой будет вызываться native-метод EnumWindows():

package lab2.ex4;

import java.util.*;

 

public class test{

 private native void Enum();

  static{

     System.load("C:\\Users\\origin\\Desktop\\2\\ex4.dll");

  }

   public static void main(String[] args) {

    Scanner con = new Scanner(System.in);

 test t = new test();

    t.Enum();

   }

}

Листинг ex4.cpp

#include "stdafx.h"

#include "lab2_ex4_test.h"

#include "iostream" 

#include "windows.h" 

BOOL CALLBACK GetWD (HWND hWnd, LPARAM lParam) {

 TCHAR c[MAX_PATH];

GetWindowTextA(hWnd,(LPSTR)c,MAX_PATH);

printf("-- %s\n",c);

   return true;

}

JNIEXPORT void JNICALL Java_lab2_ex4_test_Enum(JNIEnv *, jobject)

{

   LPARAM lParam = 1;

   EnumWindows(GetWD,lParam);

}

Задание 5 - Запаковать класс обертку в отдельный jar файл, с манифестом, и с версиями;

Создадим файл MAINFEST.MF, в который запишем:

Manifest-Version: 1.0

Main-Class: test

Задание 6 - Запечатать пакет в созданном в пункте 5 jar файле;

Создадим файл MAINFEST.MF в котором будет содержаться:

Manifest-Version: 1.0

Name: name/

Sealed: true

Main-Class: test

Задание 7 - Запустить свою программу с вызовом метода из jar сделанной в пункте 4 – 5

                             Рис1. – Результат команды javajar ex5.jar

Задание 8 - Запаковать свою программу в jar-файл со всеми требуемыми ресурсами;

import java.util.*;

import java.io.*;

 

public class test{

 private native void Enum();

   private static void loadLib(String name) {

       try {

           InputStream in = test.class.getResourceAsStream(name);

           File fileOut = new File(System.getProperty("java.io.tmpdir") + "/" + name);

           OutputStream out = new FileOutputStream(fileOut);

           int c;

     

  while ((c = in.read()) != -1) {

   out.write(c);

  }

  

  in.close();

  out.close();

           

  System.load(fileOut.toString());

       } catch (Exception e) {

  System.out.println("Error Load dll");

       }

}

 

  static{

  loadLib("ex8.dll");

  }

   public static void main(String[] args) {

    Scanner con = new Scanner(System.in);

 test t = new test();

    t.Enum();

   }

}

Задание 9 - Запуск программы

               Рис2. – Результат команды javajar ex8.jar

Задание 10 - Реализовать отдельно программу, которая будет загружать ваш jar созданный в    пункте 8.

import java.io.*;

import java.lang.reflect.*;

import java.net.*;

import java.util.jar.*;

import java.util.*;

public class test1{

 

private void runProg(String path){

 try{

  System.out.println(path);

  

  JarFile jFile = new JarFile(path);

  Attributes attrs = jFile.getManifest().getMainAttributes();

  String mainClass = attrs.getValue("Main-Class");

  

  System.out.println(mainClass);

  

  URL urls = new File(path).toURL();

  URLClassLoader cl = new URLClassLoader(new URL[]{urls});

  

  Thread.currentThread().setContextClassLoader(cl);

  

  String[] aaa = new String[0];

  Class cMainClass = cl.loadClass(mainClass);

     

  Method main = cMainClass.getMethod("main", new Class[] {aaa.getClass()});

  main.invoke(cMainClass.newInstance(), new Object[] {aaa});

  

 } catch (IOException e){

  e.printStackTrace();

 } catch (NoSuchMethodException e){

  e.printStackTrace();

 } catch (ClassNotFoundException e){

  e.printStackTrace();

 } catch (SecurityException e){

  e.printStackTrace();

 } catch (IllegalAccessException e){

  e.printStackTrace();

 } catch (IllegalArgumentException e){

  e.printStackTrace();

 } catch (InvocationTargetException e){

  e.printStackTrace();

 } catch (InstantiationException e){

  e.printStackTrace();

 }

}

 

 public static void main(String[] args){

  test1 run = new test1();

  

 for (String a : args){

  run.runProg(a);

 }

}

}

Вывод:

Научился запаковывать свои классы в исполняемые jar файлы. Получил практические навыки по использованию сторонних библиотек в jar-файлах. Изучил технологию JNI и научился связываться с DLL написанными на С\С++.


 

А также другие работы, которые могут Вас заинтересовать

82657. Застосування теорії ігор для вирішення задач щодо прийняття рішень на митниці 504.85 KB
  Митно-прикордонна служба США – це орган правозастосування федерального законодавства Міністерства національної безпеки США, на який покладена відповідальність за питання, що пов’язані з регулюванням та спрощенням міжнародної торгівлі, збором митних платежів та врегулюванням сотень положень США...
82658. Исследование контактных явлений в структуре металл-полупроводник 515.01 KB
  Определение эффективной массы носителей заряда, их концентрации и степень вырождения электронно-дырочного газа в полупроводнике в данном диапазоне температур. Расчёт зависимости времени релаксации, средней длины свободного пробега и электропроводности от температуры...
82660. Аналіз використання трудових ресурсів підприємства ПСП «Агрофірми «Шульц» 560 KB
  Аналіз чисельності та складу працівників. Для характеристики усієї сукупності працівників підприємства застосовуються терміни персонал кадри. Персонал підприємства являє собою сукупність постійних працівників що отримали необхідну професійну підготовку та або мають досвід практичної діяльності.
82662. Организация труда и технико-экономическая оценка деятельности котельной №16 МУП «Гортепло» с тремя котлами 750.5 KB
  В настоящее время ситуация существенно изменилась. Уменьшение объема финансовых средств и материальных ресурсов, выделяемых из бюджета государства на развитие, ремонт и реконструкцию ТЭЦ и тепловых сетей, повлекло за собой: увеличение сроков сооружения тепловых электростанций и ввода новых...
82663. Редуктор конический с прямолинейными зубьями 183.6 KB
  Цель - спроектировать привод ленточного транспортера с одноступенчатым коническим прямозубым редуктором. Развить ощущение пропорции и получить конструкторские навыки, и опыт в решении комплексных инженерных заданий. Изучить влияние технологии изготовлении деталей на их конструкцию и метод расчета...
82664. Формирование баланса предприятия и определение источников финансирования инвестиций 3.93 MB
  Нормальное функционирование предприятия на сегодняшний день требует глубоких экономических знаний. Ведь в условиях рыночной экономики выживет лишь тот, кто наиболее грамотно и компетентно определит требования рынка, создаст и организует производство продукции, пользующейся спросом...
82665. Конституционно-правовая основа социального государства (анализ конституции РФ) 21.86 KB
  В качестве основной категории в определении социального государства выступает понятие социальной справедливости, под которой понимается как понятие о должном, содержащее в себе требование соответствия деяния и воздаяния.