Upload
aleda
View
30
Download
0
Embed Size (px)
DESCRIPTION
ScriptBasic külső modulok kezelése, összehasonlítás más alkalmazásokkal. Peter Verh á s 2002 március 26. Tartalom. Java programozás kiterjesztése JNI felülettel Perl XS modulok PHP külső modulok. JNI: Java Native Interface. - PowerPoint PPT Presentation
Citation preview
S B
ScriptBasic külső modulok kezelése, összehasonlítás más
alkalmazásokkal
Peter Verhás2002 március 26.
S B Tartalom
• Java programozás kiterjesztése JNI felülettel
• Perl XS modulok• PHP külső modulok
S B JNI: Java Native Interface
http://java.sun.com/docs/books/tutorial/native1.1/concepts/index.html
JRE
modul.dll
JNI
A Java nyelvhez lehet C nyelven programokat írni ennek a felületnek a felhasználásával.
S B JNI modul írásának lépései
1. Java program írásával kell kezdeni. A Java osztályt kell létrehozni, amelyik deklarálja a natív függvényeket, és a main metódust, amelyik meghívja majd a natív függvényt.
2. Lefordítjuk a Java osztályt a javac fordítóval.3. A javah –jni programmal létrehozzuk a C
fejléc fájlt. Ebben benne van a függvények prototípusa.
4. Implementáljuk C-ben a függvényeket.5. Lefordítjuk a függvényeket DLL-be (vagy SO-
ba)6. Futtatjuk a Java programot.
S B Példa: halló világ
class HelloWorld { public native void displayHelloWorld(); static { System.loadLibrary("hello"); } public static void main(String[] args) { new HelloWorld().displayHelloWorld(); } }
S B javah -jni
/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class HelloWorld */
#ifndef _Included_HelloWorld#define _Included_HelloWorld#ifdef __cplusplusextern "C" {#endif/* * Class: HelloWorld * Method: displayHelloWorld * Signature: ()V */JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld (JNIEnv *, jobject);
#ifdef __cplusplus}#endif#endif
S B Név dekoráció
Java_HelloWorld_displayHelloWorld
•Java prefix•HelloWorld osztály név•displayHelloWorld metódus név
S B Paraméterek
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
(JNIEnv *, jobject);
• JNIEnv futtatási környezet• jobject az aktuális objektum
S B Implementált C kód
#include <jni.h>#include "HelloWorld.h"#include <stdio.h>
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld (JNIEnv *env, jobject obj){ printf("Hello world!\n"); return;}
S B Második példa: getsLine
• Java kódclass Prompt {
private native String getLine(String prompt);
public static void main(String args[]) {
Prompt p = new Prompt();
String input = p.getLine("Type a line: ");
System.out.println("User typed: " + input);
}
static {
System.loadLibrary("MyImpOfPrompt");
}
}
S B C kód
JNIEXPORT jstring JNICALLJava_Prompt_getLine(JNIEnv *env, jobject obj, jstring
prompt){ char buf[128]; const char *str = (*env)->GetStringUTFChars(env, prompt, 0); printf("%s", str); (*env)->ReleaseStringUTFChars(env, prompt, str); ...
S B Második példa: getLine, getLine2
• Java kód:class Prompt2 {
private native String getLine(String prompt);
private native String getLine(String prompt, int length);
public static void main(String args[]) {
Prompt2 p = new Prompt2();
String input = p.getLine("Type a line: ");
System.out.println("User typed: " + input);
}
static {
System.loadLibrary("MyImpOfPrompt2");
}
}
S B Név dekoráció
/* * Class: Prompt2 * Method: getLine * Signature: (Ljava/lang/String;)Ljava/lang/String; */JNIEXPORT jstring JNICALL
Java_Prompt2_getLine__Ljava_lang_String_2 (JNIEnv *, jobject, jstring);
/* * Class: Prompt2 * Method: getLine * Signature: (Ljava/lang/String;I)Ljava/lang/String; */JNIEXPORT jstring JNICALL
Java_Prompt2_getLine__Ljava_lang_String_2I (JNIEnv *, jobject, jstring, jint);
S B Mit tehet egy JNI függvény?
• Java füzér kezelés• Java tömb kezelés• Java metódusok meghívása• Java változó kezelése (név
dekoráció)• Kivételkezelés• ...
S B JNI összefoglaló
• Függvény név kötött, függ a többi függvénytől (overload)
• Nincs boot/finish függvény (legyen Java szinten kezelve)
• Nincs statikus linkelés
S B Perl külső függvények írása
• Speciális XS nyelven, ami C kiterjesztés
• XS -> C fordító
S B Demó XS készítése
• h2xs -A -n Mytest– Elkészít minden szükséges alap fájlt– Mytest.xs– Makefile.PL– Mytest.pm
S B Mytest.xs
#include "EXTERN.h"#include "perl.h"#include "XSUB.h"
MODULE = Mytest PACKAGE = Mytest
voidhello() CODE: printf("hello");
S B Az XS-ből generált C fájl 1/3
/* * This file was generated automatically by xsubpp version
1.9508 from the * contents of Mytest.xs. Do not edit this file, edit
Mytest.xs instead. * * ANY CHANGES MADE HERE WILL BE LOST! * */
#line 1 "Mytest.xs"#include "EXTERN.h"#include "perl.h"#include "XSUB.h"
#line 16 "Mytest.c"
S B Az XS-ből generált C fájl 2/3
XS(XS_Mytest_hello){ dXSARGS; if (items != 0)
Perl_croak(aTHX_ "Usage: Mytest::hello()"); {#line 11 "Mytest.xs" printf("hello");#line 25 "Mytest.c" } XSRETURN_EMPTY;}
S B Az XS-ből generált C fájl 3/3
#ifdef __cplusplusextern "C"#endifXS(boot_Mytest){ dXSARGS; char* file = __FILE__;
XS_VERSION_BOOTCHECK ;
newXS("Mytest::hello", XS_Mytest_hello, file);
XSRETURN_YES;}
S B Mytest.pm
package Mytest;use 5.006;use strict;use warnings;require Exporter;require DynaLoader;our @ISA = qw(Exporter DynaLoader);our %EXPORT_TAGS = ( 'all' => [ qw( ) ] );our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );our @EXPORT = qw();our $VERSION = '0.01';bootstrap Mytest $VERSION;1;__END__
S B Php architektúra
S B PHP kiterjesztés minta 1/3
/* include standard header */#include "php.h"
/* declaration of functions to be exported */ZEND_FUNCTION(first_module);
/* compiled function list so Zend knows what's in this module */zend_function_entry firstmod_functions[] ={ ZEND_FE(first_module, NULL) {NULL, NULL, NULL}};
S B PHP kiterjesztés minta 2/3
/* compiled module information */zend_module_entry firstmod_module_entry ={ STANDARD_MODULE_HEADER, "First Module", firstmod_functions, NULL, NULL, NULL, NULL, NULL, NO_VERSION_YET, STANDARD_MODULE_PROPERTIES};
S B PHP kiterjesztés minta 3/3
/* implement standard "stub" routine to introduce ourselves to Zend */#if COMPILE_DL_FIRST_MODULEZEND_GET_MODULE(firstmod)#endif
/* implement function that is meant to be made available to PHP */ZEND_FUNCTION(first_module){ long parameter;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", ¶meter) == FAILURE) {
return; }
RETURN_LONG(parameter);}
S B PHP kód amit ezt használja
<?php dl("first_module.so");
$param = 2;$return = first_module($param);
print("We sent '$param' and got '$return'");
?>
S B PHP függvény prototípus
ZEND_FUNCTION ( my_function );
Kifejtve:
void zif_my_function( int ht, argumentumok száma
zval * return_value, zval * this_ptr, objektum pointer
int return_value_used, a hívónak kell a visszatérési érték?
zend_executor_globals * executor_globals );
S B PHP kiterjesztés
http://www.zend.com/apidoc/zend.php
• Multi-process, single-thread• emalloc a memóriavesztés ellen,
de nem többszálú• Van processz és szál
startup/shutdown, de ezek a szálak nem konkurrensek
S B Összehasonlítás
Java• DLL• dekorált név• multi-thread
PHP• static/DLL• nem
dekorált név• single-
thread
Perl• DLL/static• dekorált név• multi-
thread?
ScriptBasic• DLL/static• nem dekorált név• multi-thread
S B
Köszönöm a figyelmet