- Moving java and dotnet extensions to ext/rpc

This commit is contained in:
Derick Rethans 2003-01-11 12:23:45 +00:00
parent c8d19858ac
commit 6b7eaaa2c4
18 changed files with 0 additions and 2527 deletions

View File

@ -1,2 +0,0 @@
dotnet
Sam Ruby

View File

@ -1,5 +0,0 @@
this extension is experimental,
its functions may change their names
or move to extension all together
so do not rely to much on them
you have been warned!

View File

@ -1,32 +0,0 @@
Warning
=======
This support is EXPERIMENTAL. In fact, it integrates code that
Microsoft labels as pre-beta. Use at your own risk.
Build instructions
==================
Download and install the .NET Framework SDK Technology Preview from
http://msdn.microsoft.com/net/#sdk. Once installed, copy Mscoree.h
(typically found in C:\Program Files\NGWSSDK\Include to ext\dotnet).
Do not simply add the NGWSSDK\Include directory to the include path
as this will cause compilation failures.
Download and unzip the source to the dm.net COM Moniker from
http://staff.develop.com/jasonw/clr/readme.htm. Copy mscorlib.h
to ext\dotnet. There is no need to register the clrmonsrv.dll as
it is not used.
At this point, the dotnet project can be built like any other
project, from either VisualStudio 6's GUI or from the command line.
Example command line invocation:
msdev dotnet.dsp /MAKE "dotnet - Win32 Debug_TS"
Execution instructions:
=======================
Add "extension=php_dotnet.dll" into php.ini.
Sample program can be found at dotnet.php

View File

@ -1,237 +0,0 @@
/*
+----------------------------------------------------------------------+
| PHP Version 4 |
+----------------------------------------------------------------------+
| Copyright (c) 1997-2002 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 2.02 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.php.net/license/2_02.txt. |
| If you did not receive a copy of the PHP license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@php.net so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Author: Sam Ruby <rubys@us.ibm.com> |
| Harald Radi <h.radi@nme.at> |
+----------------------------------------------------------------------+
*/
/*
* This module implements support for Microsoft .Net components.
*/
/*
* 28.1.2001
* use external unicode conversion functions
*
* harald radi <h.radi@nme.at>
*/
#ifdef PHP_WIN32
#include <iostream>
#include <math.h>
#include <comdef.h>
extern "C"
{
#include "php.h"
#include "ext/standard/info.h"
}
#include "ext/com/conversion.h"
#include "ext/com/php_COM.h"
#include "Mscoree.h"
#include "mscorlib.h"
using namespace mscorlib;
static ICorRuntimeHost *pHost;
static mscorlib::_AppDomain *pDomain;
static zend_class_entry dotnet_class_entry;
static int codepage;
HRESULT dotnet_init() {
HRESULT hr;
hr = CoCreateInstance(CLSID_CorRuntimeHost, NULL, CLSCTX_ALL,
IID_ICorRuntimeHost, (void **)&pHost);
if (FAILED(hr)) return hr;
hr = pHost->Start();
if (FAILED(hr)) return hr;
IUnknown *uDomain;
hr = pHost->GetDefaultDomain(&uDomain);
if (FAILED(hr)) return hr;
hr = uDomain->QueryInterface(__uuidof(_AppDomain), (void**) &pDomain);
if (FAILED(hr)) return -1;
uDomain->Release();
return ERROR_SUCCESS;
}
HRESULT dotnet_create(OLECHAR *assembly, OLECHAR *datatype, comval *obj TSRMLS_DC) {
HRESULT hr;
_ObjectHandle *pHandle;
hr = pDomain->CreateInstance(_bstr_t(assembly), _bstr_t(datatype), &pHandle);
if (FAILED(hr)) return hr;
if (!pHandle) return hr;
_variant_t unwrapped;
hr = pHandle->Unwrap(&unwrapped);
pHandle->Release();
if (FAILED(hr)) return hr;
php_COM_set(obj, &unwrapped.pdispVal, TRUE TSRMLS_CC);
return ERROR_SUCCESS;
}
void dotnet_term() {
if (pHost) pHost->Stop();
if (pHost) pHost->Release();
if (pDomain) pDomain->Release();
pHost = 0;
pDomain = 0;
}
/* {{{ proto int dotnet_load(string assembly_name [, string datatype_name, int codepage])
Loads a DOTNET module */
PHP_FUNCTION(dotnet_load)
{
HRESULT hr;
pval *assembly_name, *datatype_name, *code_page;
OLECHAR *assembly, *datatype;
comval *obj;
switch(ZEND_NUM_ARGS())
{
case 2:
getParameters(ht, 2, &assembly_name, &datatype_name);
codepage = CP_ACP;
break;
case 3:
getParameters(ht, 3, &assembly_name, &datatype_name, &code_page);
convert_to_long(code_page);
codepage = Z_LVAL_P(code_page);
break;
default:
WRONG_PARAM_COUNT;
break;
}
convert_to_string(assembly_name);
assembly = php_char_to_OLECHAR(Z_STRVAL_P(assembly_name), Z_STRLEN_P(assembly_name), codepage TSRMLS_CC);
convert_to_string(datatype_name);
datatype = php_char_to_OLECHAR(Z_STRVAL_P(datatype_name), Z_STRLEN_P(datatype_name), codepage TSRMLS_CC);
ALLOC_COM(obj);
/* obtain IDispatch */
hr = dotnet_create(assembly, datatype, obj TSRMLS_CC);
efree(assembly);
efree(datatype);
if (FAILED(hr)) {
char *error_message;
error_message = php_COM_error_message(hr TSRMLS_CC);
php_error(E_WARNING, "Error obtaining .Net class for %s in assembly %s: %s", datatype_name->value.str.val, assembly_name->value.str.val, error_message);
LocalFree(error_message);
efree(obj);
RETURN_FALSE;
}
if (C_DISPATCH(obj) == NULL) {
php_error(E_WARNING, "Unable to locate %s in assembly %s", datatype_name->value.str.val, assembly_name->value.str.val);
efree(obj);
RETURN_FALSE;
}
RETURN_LONG(zend_list_insert(obj, IS_COM));
}
/* }}} */
void php_DOTNET_call_function_handler(INTERNAL_FUNCTION_PARAMETERS, zend_property_reference *property_reference)
{
pval *object = property_reference->object;
zend_overloaded_element *function_name = (zend_overloaded_element *) property_reference->elements_list->tail->data;
if (zend_llist_count(property_reference->elements_list)==1
&& !strcmp(Z_STRVAL(function_name->element), "dotnet")) { /* constructor */
pval *object_handle;
PHP_FN(dotnet_load)(INTERNAL_FUNCTION_PARAM_PASSTHRU);
if (!Z_LVAL_P(return_value)) {
ZVAL_FALSE(object);
return;
}
ALLOC_ZVAL(object_handle);
*object_handle = *return_value;
pval_copy_constructor(object_handle);
INIT_PZVAL(object_handle);
zend_hash_index_update(Z_OBJPROP_P(object), 0, &object_handle, sizeof(pval *), NULL);
pval_destructor(&function_name->element);
} else {
php_COM_call_function_handler(INTERNAL_FUNCTION_PARAM_PASSTHRU, property_reference);
}
}
void php_register_DOTNET_class(TSRMLS_D)
{
INIT_OVERLOADED_CLASS_ENTRY(dotnet_class_entry, "DOTNET", NULL,
php_DOTNET_call_function_handler,
php_COM_get_property_handler,
php_COM_set_property_handler);
zend_register_internal_class(&dotnet_class_entry TSRMLS_CC);
}
function_entry DOTNET_functions[] = {
{NULL, NULL, NULL}
};
static PHP_MINFO_FUNCTION(DOTNET)
{
php_info_print_table_start();
php_info_print_table_row(2, ".NET support", "enabled");
php_info_print_table_end();
}
PHP_MINIT_FUNCTION(DOTNET)
{
HRESULT hr;
if (FAILED(hr = dotnet_init())) {
return hr;
}
php_register_DOTNET_class(TSRMLS_C);
return SUCCESS;
}
PHP_MSHUTDOWN_FUNCTION(DOTNET)
{
dotnet_term();
return SUCCESS;
}
zend_module_entry dotnet_module_entry = {
STANDARD_MODULE_HEADER,
"dotnet", DOTNET_functions, PHP_MINIT(DOTNET), PHP_MSHUTDOWN(DOTNET), NULL, NULL, PHP_MINFO(DOTNET), NO_VERSION_YET, STANDARD_MODULE_PROPERTIES
};
BEGIN_EXTERN_C()
ZEND_GET_MODULE(dotnet)
END_EXTERN_C()
#endif

View File

@ -1,167 +0,0 @@
# Microsoft Developer Studio Project File - Name="dotnet" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
CFG=dotnet - Win32 Debug_TS
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
!MESSAGE use the Export Makefile command and run
!MESSAGE
!MESSAGE NMAKE /f "dotnet.mak".
!MESSAGE
!MESSAGE You can specify a configuration when running NMAKE
!MESSAGE by defining the macro CFG on the command line. For example:
!MESSAGE
!MESSAGE NMAKE /f "dotnet.mak" CFG="dotnet - Win32 Debug_TS"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "dotnet - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "dotnet - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "dotnet - Win32 Debug_TS" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "dotnet - Win32 Release_TS" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE
# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
MTL=midl.exe
RSC=rc.exe
!IF "$(CFG)" == "dotnet - Win32 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "..\..\Release"
# PROP BASE Intermediate_Dir "Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MD /W3 /GX /O2 /D "PHP_WIN32" /D "ZEND_WIN32" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /YX /FD /c
# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\.." /I "..\..\main" /I "..\..\Zend" /I "..\..\..\bindlib_w32" /I "..\..\TSRM" /D "NDEBUG" /D ZEND_DEBUG=0 /D "PHP_WIN32" /D "ZEND_WIN32" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMPILE_DL_JAVA" /D HAVE_JAVA=1 /YX /FD /c
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x40d /d "NDEBUG"
# ADD RSC /l 0x40d /d "NDEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /out:"..\..\Release/php_dotnet.dll" /libpath:"$(JAVA_HOME)\lib" /libpath:"..\..\Release"
!ELSEIF "$(CFG)" == "dotnet - Win32 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "..\..\Debug"
# PROP BASE Intermediate_Dir "Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /D "PHP_WIN32" /D "ZEND_WIN32" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /YX /FD /GZ /c
# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\.." /I "..\..\main" /I "..\..\Zend" /I "..\..\..\bindlib_w32" /I "..\..\TSRM" /D "_DEBUG" /D ZEND_DEBUG=1 /D "PHP_WIN32" /D "ZEND_WIN32" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMPILE_DL_JAVA" /D HAVE_JAVA=1 /FR /YX /FD /GZ /c
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x40d /d "_DEBUG"
# ADD RSC /l 0x40d /d "_DEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /out:"..\..\Debug/php_dotnet.dll" /pdbtype:sept /libpath:"$(JAVA_HOME)\lib" /libpath:"..\..\Debug"
!ELSEIF "$(CFG)" == "dotnet - Win32 Debug_TS"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "..\..\Debug_TS"
# PROP BASE Intermediate_Dir "Debug_TS"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug_TS"
# PROP Intermediate_Dir "Debug_TS"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\.." /I "..\..\..\Zend" /I "$(JAVA_HOME)\include\win32" /I "$(JAVA_HOME)\include" /I "..\..\..\bindlib_w32" /D "_DEBUG" /D "PHP_WIN32" /D "ZEND_WIN32" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMPILE_DL_JAVA" /FR /YX /FD /GZ /c
# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\..\\" /I "..\..\main" /I "..\..\Zend" /I "..\..\..\bindlib_w32" /I "..\..\TSRM" /D "_DEBUG" /D ZEND_DEBUG=1 /D "ZTS" /D "PHP_WIN32" /D "ZEND_WIN32" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /FR /YX /FD /D /GZ /c
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x40d /d "_DEBUG"
# ADD RSC /l 0x40d /d "_DEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib php4ts_debug.lib /nologo /dll /debug /machine:I386 /out:"..\..\Debug_TS/php_dotnet.dll" /pdbtype:sept /libpath:"..\..\Debug_TS"
!ELSEIF "$(CFG)" == "dotnet - Win32 Release_TS"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "..\..\Release_TS"
# PROP BASE Intermediate_Dir "Release_TS"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release_TS"
# PROP Intermediate_Dir "Release_TS"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MD /W3 /GX /O2 /I "..\.." /I "..\..\..\Zend" /I "$(JAVA_HOME)\include\win32" /I "$(JAVA_HOME)\include" /I "..\..\..\bindlib_w32" /D "NDEBUG" /D "PHP_WIN32" /D "ZEND_WIN32" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMPILE_DL_JAVA" /YX /FD /c
# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\..\\" /I "..\..\main" /I "..\..\Zend" /I "..\..\..\bindlib_w32" /I "..\..\TSRM" /D "NDEBUG" /D ZEND_DEBUG=0 /D "ZTS" /D "PHP_WIN32" /D "ZEND_WIN32" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /YX /FD /c
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x40d /d "NDEBUG"
# ADD RSC /l 0x40d /d "NDEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib php4ts.lib /nologo /dll /machine:I386 /out:"..\..\Release_TS/php_dotnet.dll" /libpath:"..\..\Release_TS" /libpath:"..\..\Release_TS_Inline"
!ENDIF
# Begin Target
# Name "dotnet - Win32 Release"
# Name "dotnet - Win32 Debug"
# Name "dotnet - Win32 Debug_TS"
# Name "dotnet - Win32 Release_TS"
# Begin Group "Source Files"
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
# Begin Source File
SOURCE=.\dotnet.cpp
# End Source File
# End Group
# Begin Group "Header Files"
# PROP Default_Filter "h;hpp;hxx;hm;inl"
# Begin Source File
SOURCE=.\php_dotnet.h
# End Source File
# End Group
# Begin Source File
SOURCE=.\README
# End Source File
# End Target
# End Project

View File

@ -1,8 +0,0 @@
<?
$stack = new DOTNET("mscorlib","System.Collections.Stack");
$stack->Push(".Net");
$stack->Push("Hello ");
echo $stack->Pop() . $stack->Pop();
?>

View File

@ -1,21 +0,0 @@
#ifndef PHP_DOTNET_H
#define PHP_DOTNET_H
#ifdef PHP_WIN32
PHP_MINIT_FUNCTION(DOTNET);
PHP_MSHUTDOWN_FUNCTION(DOTNET);
PHP_FUNCTION(DOTNET_load);
extern zend_module_entry DOTNET_module_entry;
#define DOTNET_module_ptr &DOTNET_module_entry
#else
#define DOTNET_module_ptr NULL
#endif /* PHP_WIN32 */
#define phpext_DOTNET_ptr DOTNET_module_ptr
#endif /* PHP_DOTNET_H */

View File

@ -1,2 +0,0 @@
Java
Sam Ruby

View File

@ -1,5 +0,0 @@
this extension is experimental,
its functions may change their names
or move to extension all together
so do not rely to much on them
you have been warned!

View File

@ -1,13 +0,0 @@
$(srcdir)/java.c : $(srcdir)/php_java.jar
$(srcdir)/php_java.jar : $(srcdir)/reflect.java
@$(mkinstalldirs) $(srcdir)/net/php
@cp $(srcdir)/reflect.java $(srcdir)/net/php
@echo library=php_java > $(srcdir)/net/php/reflect.properties
@$(JAVA_C) $(srcdir)/net/php/reflect.java
@test ! -f reflect.class || mv reflect.class $(srcdir)/net/php # bug in KJC javac
@$(JAVA_JAR) $(srcdir)/php_java.jar -C $(srcdir) net/php/reflect.class -C $(srcdir) net/php/reflect.properties
@rm $(srcdir)/net/php/reflect.*
@rmdir $(srcdir)/net/php
@rmdir $(srcdir)/net

View File

@ -1,247 +0,0 @@
What is PHP4 ext/java?
PHP4 ext/java provides a simple and effective means for creating and
invoking methods on Java objects from PHP. The JVM is created using JNI,
and everything runs in-process.
Two examples are provided, jver and jawt, to illustrate usage of this
extension. A few things to note:
1) new Java() will create an instance of a class if a suitable constructor
is available. If no parameters are passed and the default constructor
is useful as it provides access to classes like "java.lang.System"
which expose most of their functionallity through static methods.
2) Accessing a member of an instance will first look for bean properties
then public fields. In other words, "print $date.time" will first
attempt to be resolved as "$date.getTime()", then as "$date.time";
3) Both static and instance members can be accessed on an object with
the same syntax. Furthermore, if the java object is of type
"java.lang.Class", then static members of the class (fields and
methods) can be accessed.
4) Exceptions raised result in PHP warnings, and null results. The
warnings may be eliminated by prefixing the method call with an
"@" sign. The following APIs may be used to retrieve and reset
the last error:
java_last_exception_get()
java_last_exception_clear()
5) Overload resolution is in general a hard problem given the
differences in types between the two languages. The PHP Java
extension employs a simple, but fairly effective, metric for
determining which overload is the best match.
Additionally, method names in PHP are not case sensitive, potentially
increasing the number of overloads to select from.
Once a method is selected, the parameters are cooerced if necessary,
possibly with a loss of data (example: double precision floating point
numbers will be converted to boolean).
6) In the tradition of PHP, arrays and hashtables may pretty much
be used interchangably. Note that hashtables in PHP may only be
indexed by integers or strings; and that arrays of primitive types
in Java can not be sparse. Also note that these constructs are
passed by value, so may be expensive in terms of memory and time.
Build and execution instructions:
Given the number of platforms and providers of JVMs, no single set of
instructions will be able to cover all cases. So in place of hard and
fast instructions, below are a working examples for a number of free and
commercial implementations and platforms. Please adjust the paths to
suit your installation. Also, if you happen to get this to work on
another JVM/platform combination, please let me know, particularly if
a unique build or execution setup was required.
Note for Windows users: semi-colons (";") mark the beginning of
comments in php.ini files, so if you wish to add to the classpath,
make sure that the entire string is in quotes. See the JDK 1.1.8
instructions below for an example.
This function has been tested in both CGI and Apache (apxs) modes. As
the current design requires shared libraries, this support can not be
linked statically into Apache.
With ext/java, no Java Virtual Machines are created until the first
Java call is made. This not only eliminates unnecessary overhead if
the extension is never used, it also provides error messages directly
back to the user instead of being burried in a log some place.
For people interested in robustness, performance, and more complete
integration with Java, consider using the sapi/servlet interface which
is built upon the Java extension. Running PHP as a servlet enables PHP
to utilize the existing JVM and threads from the servlet engine, and
provides direct access to the servlet request and response objects.
Finally, the bottom of this readme contains some guidance for how to
approach situations in which these instructions don't work on your
machine.
========================================================================
=== JVM=Kaffe 1.0.4 (as delivered with OS), OS=Redhat Linux 6.1 ===
========================================================================
build instructions:
./configure --with-java
php.ini:
[java]
java.library.path=/usr/lib/kaffe:/home/rubys/php4/modules
java.class.path=/usr/share/kaffe/Klasses.jar:/home/rubys/php4/modules/php_java.jar
extension_dir=/home/rubys/php4/modules
extension=java.so
========================================================================
=== JVM=Kaffe 1.0.5 (built from source), OS=Redhat Linux 6.1 ===
========================================================================
build instructions:
./configure --with-java
php.ini:
[java]
java.library.path=/usr/local/lib/kaffe:/home/rubys/php4/modules
java.class.path=/usr/local/share/kaffe/Klasses.jar:/home/rubys/php4/modules/php_java.jar
extension_dir=/home/rubys/php4/modules
extension=java.so
========================================================================
=== JVM=IBM 1.1.8, OS=Redhat Linux 6.1 ===
========================================================================
build instructions:
./configure --with-java
php.ini:
[java]
java.class.path=/home/jdk118/lib/classes.zip:/home/rubys/php4/modules/php_java.jar
extension_dir=/home/rubys/php4/modules
extension=java.so
========================================================================
=== JVM=Blackdown 1.2.2 RC4, OS=Redhat Linux 6.1 ===
========================================================================
build instructions:
./configure --with-java
php.ini:
[java]
java.class.path=/home/rubys/php4/lib/php_java.jar
extension_dir=/home/rubys/php4/modules
extension=java.so
========================================================================
=== JVM=Sun JDK 1.2.2, OS=Linux ===
========================================================================
build instructions:
./configure --with-java
php.ini:
[java]
java.class.path=/home/rubys/php4/lib/php_java.jar
java.library.path=/home/rubys/php4/modules
extension_dir=/home/rubys/php4/modules
extension=java.so
========================================================================
=== JVM=Sun JDK 1.1.8, OS=Windows NT 4 ===
========================================================================
build instructions:
SET JAVA_HOME=D:\jdk1.1.8
msdev ext\java\java.dsp /MAKE "java - Win32 Debug_TS"
php.ini:
[java]
java.class.path="D:\jdk1.1.8\lib\classes.zip;F:\PHP4\Debug_TS\php_java.jar"
extension=php_java.dll
========================================================================
=== JVM=Sun JDK 1.2.2, OS=Windows NT 4 ===
========================================================================
build instructions:
SET JAVA_HOME=D:\jdk1.2.2
msdev ext\java\java.dsp /MAKE "java - Win32 Debug_TS"
php.ini:
[java]
java.class.path=F:\PHP4\Debug_TS\php_java.jar
extension=php_java.dll
=========================================================================
Guidance for when these instructions don't work.
JDK vendors don't typically document their internal workings, and are
typically very reliant on code inside of the JAVA main program and the
installation directory structure. For this reason, running PHP as a
servlet is typically much easier to get working. But if for some reason
this is not appropriate for you, and the instructions above don't work,
then read on.
The first thing to realize is that the directory structure of the JDK is
very important. Some users (particularly on Windows) get a message about
a DLL or shared library not being available and proceed to find that file
and copy it into a system directory. This typically just gets you to the
next problem - for example, it appears that many JDKs attempt to locate
the runtime Java classes (rt.jar) in a directory relative to these system
libraries. So unless you are inclined to copy your entire Java
installation, you are much better adjusting your PATHs.
Not documented above, but useful for many JDK's is ability to specify the
library path via java.library.path in the php.ini. On many Unix machines,
determining the initial value for this can be done by changing directory
to where you find a shared library that can't be loaded (example:
libjava.so), and executing "ld libjava.so". If you see some modules
listed as "not found", add the necessary directories to LD_LIBRARY_PATH
and repeat until successful. On my system, I require the following
two directories.
/home/jdk1.2.2/jre/lib/i386/native_threads
/home/jdk1.2.2/jre/lib/i386/classic
Note: this only determines the statically loaded libraries. Additional
libraries (such as libzip.so) may be loaded dynamically. On my system,
libzip.so is located in
/home/jdk1.2.2/jre/lib/i386
Another php.ini variable which may be helpful is java.home.
If java.library.path doesn't work for you (it won't on any JDK 1.1
implementations, for example), then try setting the system PATH or the
LD_LIBRARY_PATH before starting your web server. For Apache on Linux
systems, this can be accomplished by editing the Root's .bashrc and
adding the necessary export LD_LIBRARY_PATH statement.
If that doesn't work, try dividing an (hopefully) conquering by temporarily
eliminating items such as Apache from the process by adjusting the
arguments passed to the ./configure command (i.e., removing --with-apxs).
If all else fails, "man dlopen" on Unix systems will give more insight on
what the system is trying to do internally.
There have been some issues where users need to create a symbolic link
from java.so to libphp_java.so. If you notice a large number of unexplained
crashes in your webserver log file, try doing this.

View File

@ -1,184 +0,0 @@
dnl
dnl $Id$
dnl
AC_DEFUN(JAVA_FIND_JAR, [
AC_MSG_CHECKING([Java Jar location])
if test "$PHP_JAVA" = "yes"; then
if JAVA_JAR=`which jar 2>/dev/null`; then
JAVA_JAR="$JAVA_JAR cf"
else
JAVA_JAR=
fi
PHP_JAVA=`cd \`dirname \\\`which javac\\\`\`/..;pwd`
dnl
dnl substitue zip for systems which don't have jar
dnl
if test -z "$JAVA_JAR"; then
JAVA_JAR='zip -q0'
fi
else
dnl
dnl we have a custom path defined so use it
dnl
if test -x $PHP_JAVA/bin/jar; then
JAVA_JAR="$PHP_JAVA/bin/jar cf"
else
AC_MSG_ERROR([Unable to locate $PHP_JAVA/bin])
fi
fi
PHP_SUBST(JAVA_JAR)
AC_MSG_RESULT([$JAVA_JAR])
])
AC_DEFUN(JAVA_FIND_C, [
AC_MSG_CHECKING([Java C location])
if test "$PHP_JAVA" = "yes"; then
JAVA_C=`which javac`
else
dnl
dnl We've been given a path to use, so use it
dnl
if test -x $PHP_JAVA/bin/javac; then
JAVA_C=$PHP_JAVA/bin/javac
else
AC_MSG_ERROR([Unable to locate $PHP_JAVA/bin])
fi
fi
if test -z "$JAVA_C"; then
AC_MSG_ERROR([Unable to locate the javac binary in your system path
Either adjust your Java installation or provide the Java installation path,
e.g. --with-java=/java expecting /java/bin/ to contain the binaries])
fi
PHP_SUBST(JAVA_C)
AC_MSG_RESULT([$JAVA_C])
])
AC_DEFUN(JAVA_CHECK_LIB, [
AC_MSG_CHECKING([Checking for libjava])
if test -d $PHP_JAVA/lib/kaffe; then
PHP_ADD_LIBPATH($PHP_JAVA/lib)
JAVA_CFLAGS=-DKAFFE
JAVA_INCLUDE=-I$PHP_JAVA/include/kaffe
JAVA_CLASSPATH=$PHP_JAVA/share/kaffe/Klasses.jar
JAVA_LIB=kaffevm
JAVA_LIBPATH=$PHP_JAVA/lib/kaffe
java_libext=kaffevm
test -f $PHP_JAVA/lib/$JAVA_LIB && JAVA_LIBPATH=$PHP_JAVA/lib
test -f $PHP_JAVA/lib/kaffe/$JAVA_LIB && JAVA_LIBPATH=$PHP_JAVA/lib/kaffe
dnl
dnl accomodate old versions of kaffe which don't support jar
dnl
if kaffe -version 2>&1 | grep 1.0b > /dev/null; then
JAVA_JAR='zip -q0'
fi
elif test -f $PHP_JAVA/lib/$java_libext; then
JAVA_LIB=java
JAVA_LIBPATH=$PHP_JAVA/lib
JAVA_INCLUDE=-I$PHP_JAVA/include
test -f $PHP_JAVA/lib/classes.zip && JAVA_CFLAGS=-DJNI_11
test -f $PHP_JAVA/lib/jvm.jar && JAVA_CFLAGS=-DJNI_12
test -f $PHP_JAVA/lib/classes.zip && JAVA_CLASSPATH=$PHP_JAVA/lib/classes.zip
test -f $PHP_JAVA/lib/jvm.jar && JAVA_CLASSPATH=$PHP_JAVA/lib/jvm.jar
for i in $PHP_JAVA/include/*; do
test -f $i/jni_md.h && JAVA_INCLUDE="$JAVA_INCLUDE $i"
done
dnl
dnl sample JDK v 1.4 path
dnl /usr/java/j2sdk1.4.0_01/jre/lib/i386/libjava.so
dnl
else
dnl
dnl We have to find everything
dnl
for i in `find $PHP_JAVA/include -type d`; do
test -f $i/jni.h && JAVA_INCLUDE=-I$i
test -f $i/jni_md.h && JAVA_INCLUDE="$JAVA_INCLUDE -I$i"
done
for i in `find $PHP_JAVA/ -type d`; do
test -f $i/classes.zip && JAVA_CFLAGS=-DJNI_11
test -f $i/rt.jar && JAVA_CFLAGS=-DJNI_12
test -f $i/classes.zip && JAVA_CLASSPATH=$i/classes.zip
test -f $i/rt.jar && JAVA_CLASSPATH=$i/rt.jar
if test -f $i/$java_libext; then
JAVA_LIB=java
JAVA_LIBPATH=$i
test -d $i/hotspot && PHP_ADD_LIBPATH($i/hotspot)
test -d $i/classic && PHP_ADD_LIBPATH($i/classic)
test -d $i/server && PHP_ADD_LIBPATH($i/server)
test -d $i/native_threads && PHP_ADD_LIBPATH($i/native_threads)
fi
done
if test -z "$JAVA_INCLUDE"; then
AC_MSG_RESULT(no)
AC_MSG_ERROR(unable to find Java VM includes)
fi
JAVA_CFLAGS="$JAVA_CFLAGS -D_REENTRANT"
fi
AC_MSG_RESULT([$JAVA_LIBPATH])
])
PHP_ARG_WITH(java, for Java support,
[ --with-java[=DIR] Include Java support. DIR is the JDK base install directory.
This extension is always built as shared.])
if test "$PHP_JAVA" != "no"; then
platform=`uname -s 2>/dev/null`
java_libext=libjava.so
case $platform in
AIX) java_libext=libjava.a ;;
HP-UX) java_libext=libjava.sl ;;
Darwin) java_libext=libjava.jnilib ;;
esac
JAVA_FIND_JAR()
JAVA_FIND_C()
if test "$platform" = "Darwin"; then
AC_CHECK_HEADERS([JavaVM/JavaVM.h])
AC_CHECK_HEADERS([JavaVM/jni.h])
dnl JAVA_CLASSPATH=/System/Library/Frameworks/JavaVM.framework/Classes/classes.jar
PHP_CHECK_FRAMEWORK("JavaVM", JNI_CreateJavaVM,[AC_DEFINE(HAVE_JAVA,1,[ ])])
PHP_ADD_FRAMEWORK("JavaVM")
JAVA_CFLAGS="-x objective-c"
else
JAVA_CHECK_LIB()
AC_DEFINE(HAVE_JAVA,1,[ ])
if test -z "$JAVA_LIBPATH"; then
AC_MSG_ERROR([unable to find Java VM libraries in $PHP_JAVA])
fi
PHP_ADD_LIBPATH($JAVA_LIBPATH)
JAVA_CFLAGS="$JAVA_CFLAGS '-DJAVALIB=\"$JAVA_LIBPATH/$java_libext\"'"
fi
if test "$PHP_SAPI" != "servlet"; then
PHP_NEW_EXTENSION(java, java.c, shared,, $JAVA_CFLAGS $JAVA_INCLUDE)
if test "$PHP_SAPI" = "cgi"; then
if test "$platform" != "Darwin"; then
PHP_ADD_LIBRARY($JAVA_LIB)
fi
fi
INSTALL_IT="$INSTALL_IT; \$(srcdir)/build/shtool mkdir -p -f -m 0755 \$(INSTALL_ROOT)\$(libdir)"
INSTALL_IT="$INSTALL_IT; \$(INSTALL) -m 0755 \$(srcdir)/ext/java/php_java.jar \$(INSTALL_ROOT)\$(libdir)"
fi
PHP_SUBST(JAVA_CLASSPATH)
PHP_ADD_MAKEFILE_FRAGMENT
fi

View File

@ -1,23 +0,0 @@
<?
$stack=new Java("java.util.Stack");
$stack->push(1);
#
# Should succeed and print out "1"
#
$result = $stack->pop();
$ex = java_last_exception_get();
if (!$ex) print "$result\n";
#
# Should fail - note the "@" eliminates the warning
#
$result=@$stack->pop();
$ex=java_last_exception_get();
if ($ex) print $ex->toString();
#
# Reset last exception
#
java_last_exception_clear();
?>

View File

@ -1,864 +0,0 @@
/*
+----------------------------------------------------------------------+
| PHP Version 4 |
+----------------------------------------------------------------------+
| Copyright (c) 1997-2003 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 2.02 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.php.net/license/2_02.txt. |
| If you did not receive a copy of the PHP license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@php.net so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Author: Sam Ruby (rubys@us.ibm.com) |
+----------------------------------------------------------------------+
*/
/* $Id$ */
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
/*
* This module implements Zend OO syntax overloading support for Java
* components using JNI and reflection.
*/
#include "php.h"
#include "zend_compile.h"
#include "php_ini.h"
#include "php_globals.h"
#if HAVE_JAVAVM_JAVAVM_H
#include <JavaVM/JavaVM.h>
#include <JavaVM/jni.h>
#define JNI_12
#else
#include <jni.h>
#endif
#ifdef PHP_WIN32
#include "win32/winutil.h"
#define DL_ERROR php_win_err
#endif
#include <stdio.h>
#define IS_EXCEPTION 86
/***************************************************************************/
#ifndef KAFFE
#ifndef JNI_11
#ifndef JNI_12
#ifdef JNI_VERSION_1_2
#define JNI_12
#else
#define JNI_11
#endif
#endif
#endif
#endif
#ifdef PHP_WIN32
#ifdef JNI_12
#define JAVALIB "jvm.dll"
#else
#define JAVALIB "javai.dll"
#endif
#else
#endif
/***************************************************************************/
static int le_jobject = 0;
static char *classpath = 0;
static char *libpath = 0;
static char *javahome = 0;
static char *javalib = 0;
static void *dl_handle = 0;
/* {{{ ZEND_BEGIN_MODULE_GLOBALS
*/
ZEND_BEGIN_MODULE_GLOBALS(java)
JavaVM *jvm;
JNIEnv *jenv;
jobject php_reflect;
jclass reflect_class;
ZEND_END_MODULE_GLOBALS(java)
/* }}} */
#ifdef ZTS
# define JG(v) TSRMG(java_globals_id, zend_java_globals *, v)
#else
# define JG(v) (java_globals.v)
#endif
ZEND_DECLARE_MODULE_GLOBALS(java)
static zend_class_entry java_class_entry;
static PHP_INI_MH(OnIniUpdate)
{
if (new_value) *(char**)mh_arg1 = new_value;
return SUCCESS;
}
/* {{{ PHP_INI_BEGIN
*/
PHP_INI_BEGIN()
PHP_INI_ENTRY1("java.class.path", NULL, PHP_INI_SYSTEM, OnIniUpdate, &classpath)
#ifndef JNI_11
PHP_INI_ENTRY1("java.home", NULL, PHP_INI_SYSTEM, OnIniUpdate, &javahome)
PHP_INI_ENTRY1("java.library.path", NULL, PHP_INI_SYSTEM,OnIniUpdate, &libpath)
#endif
#ifdef JAVALIB
PHP_INI_ENTRY1("java.library", JAVALIB, PHP_INI_SYSTEM, OnIniUpdate, &javalib)
#else
PHP_INI_ENTRY1("java.library", NULL, PHP_INI_SYSTEM, OnIniUpdate, &javalib)
#endif
PHP_INI_END()
/* }}} */
/***************************************************************************/
/* {{{ jvm_destroy
*/
/*
* Destroy a Java Virtual Machine.
*/
void jvm_destroy(TSRMLS_D)
{
if (JG(php_reflect)) (*JG(jenv))->DeleteGlobalRef(JG(jenv), JG(php_reflect));
JG(php_reflect) = 0;
}
/* }}} */
/* {{{ addJVMOption
*/
/*
* Create a Java Virtual Machine.
* - class.path, home, and library.path are read out of the INI file
* - appropriate (pre 1.1, JDK 1.1, and JDK 1.2) initialization is performed
* - net.php.reflect class file is located
*/
#ifdef JNI_12
static void addJVMOption(JavaVMInitArgs *vm_args, char *name, char *value)
{
char *option = (char*) malloc(strlen(name) + strlen(value) + 1);
strcpy(option, name);
strcat(option, value);
vm_args->options[vm_args->nOptions++].optionString = option;
}
#endif
/* }}} */
/* {{{ jvm_create
*/
static int jvm_create(TSRMLS_D)
{
int rc;
jobject local_php_reflect;
jthrowable error;
jint (JNICALL *JNI_CreateVM)(const void*, const void*, void*);
#ifndef JNI_12
jint (JNICALL *JNI_DefaultArgs)(void*);
#endif
#ifdef JNI_11
JDK1_1InitArgs vm_args;
#else
JavaVMInitArgs vm_args;
#ifdef JNI_12
JavaVMOption options[3];
#endif
#endif
if (javalib) {
dl_handle = DL_LOAD(javalib);
if (!dl_handle) {
php_error(E_ERROR, "Unable to load Java Library %s, error: %s",
javalib, DL_ERROR());
return -1;
}
}
#ifndef JAVALIB
if (!dl_handle)
JNI_CreateVM = &JNI_CreateJavaVM;
else
#endif
JNI_CreateVM = (jint (JNICALL *)(const void*, const void*, void*))
DL_FETCH_SYMBOL(dl_handle, "JNI_CreateJavaVM");
if (!JNI_CreateVM) {
php_error(E_ERROR, "Unable to locate CreateJavaVM function");
return -1;
}
#ifdef JNI_12
vm_args.version = JNI_VERSION_1_2;
vm_args.ignoreUnrecognized = JNI_FALSE;
vm_args.options = options;
vm_args.nOptions = 0;
if (classpath) addJVMOption(&vm_args, "-Djava.class.path=", classpath);
if (javahome) addJVMOption(&vm_args, "-Djava.home=", javahome);
if (libpath) addJVMOption(&vm_args, "-Djava.library.path=", libpath);
#else
#ifndef JAVALIB
if (!dl_handle)
JNI_DefaultArgs = &JNI_GetDefaultJavaVMInitArgs;
else
#endif
JNI_DefaultArgs = (jint (JNICALL *)(void*))
DL_FETCH_SYMBOL(dl_handle, "JNI_GetDefaultJavaVMInitArgs");
if (!JNI_DefaultArgs) {
php_error(E_ERROR, "Unable to locate GetDefaultJavaVMInitArgs function");
return -1;
}
vm_args.version=0x00010001;
(*JNI_DefaultArgs)(&vm_args);
if (!classpath) classpath = "";
vm_args.classpath = classpath;
#ifdef KAFFE
vm_args.classhome = javahome;
vm_args.libraryhome = libpath;
#endif
#endif
rc = (*JNI_CreateVM)(&JG(jvm), &JG(jenv), &vm_args);
if (rc) {
php_error(E_ERROR, "Unable to create Java Virtual Machine");
return rc;
}
JG(reflect_class) = (*JG(jenv))->FindClass(JG(jenv), "net/php/reflect");
error = (*JG(jenv))->ExceptionOccurred(JG(jenv));
if (error) {
jclass errClass;
jmethodID toString;
jobject errString;
const char *errAsUTF;
jboolean isCopy;
JNIEnv *jenv = JG(jenv);
(*jenv)->ExceptionClear(jenv);
errClass = (*jenv)->GetObjectClass(jenv, error);
toString = (*jenv)->GetMethodID(jenv, errClass, "toString",
"()Ljava/lang/String;");
errString = (*jenv)->CallObjectMethod(jenv, error, toString);
errAsUTF = (*jenv)->GetStringUTFChars(jenv, errString, &isCopy);
php_error(E_ERROR, "%s", errAsUTF);
if (isCopy) (*jenv)->ReleaseStringUTFChars(jenv, error, errAsUTF);
jvm_destroy(TSRMLS_C);
return -1;
}
local_php_reflect = (*JG(jenv))->AllocObject(JG(jenv), JG(reflect_class));
JG(php_reflect) = (*JG(jenv))->NewGlobalRef(JG(jenv), local_php_reflect);
return rc;
}
/* }}} */
/***************************************************************************/
/* {{{ _java_makeObject
*/
static jobject _java_makeObject(pval* arg TSRMLS_DC)
{
JNIEnv *jenv = JG(jenv);
jobject result;
pval **handle;
int type;
jmethodID makeArg;
jclass hashClass;
switch (Z_TYPE_P(arg)) {
case IS_STRING:
result=(*jenv)->NewByteArray(jenv, Z_STRLEN_P(arg));
(*jenv)->SetByteArrayRegion(jenv, (jbyteArray)result, 0,
Z_STRLEN_P(arg), Z_STRVAL_P(arg));
break;
case IS_OBJECT:
zend_hash_index_find(Z_OBJPROP_P(arg), 0, (void*)&handle);
result = zend_list_find(Z_LVAL_PP(handle), &type);
break;
case IS_BOOL:
makeArg = (*jenv)->GetMethodID(jenv, JG(reflect_class), "MakeArg",
"(Z)Ljava/lang/Object;");
result = (*jenv)->CallObjectMethod(jenv, JG(php_reflect), makeArg,
(jboolean)(Z_LVAL_P(arg)));
break;
case IS_LONG:
makeArg = (*jenv)->GetMethodID(jenv, JG(reflect_class), "MakeArg",
"(J)Ljava/lang/Object;");
result = (*jenv)->CallObjectMethod(jenv, JG(php_reflect), makeArg,
(jlong)(Z_LVAL_P(arg)));
break;
case IS_DOUBLE:
makeArg = (*jenv)->GetMethodID(jenv, JG(reflect_class), "MakeArg",
"(D)Ljava/lang/Object;");
result = (*jenv)->CallObjectMethod(jenv, JG(php_reflect), makeArg,
(jdouble)(Z_DVAL_P(arg)));
break;
case IS_ARRAY:
{
jobject jkey, jval;
zval **value;
zval key;
char *string_key;
ulong num_key;
jobject jold;
jmethodID put, init;
hashClass = (*jenv)->FindClass(jenv, "java/util/Hashtable");
init = (*jenv)->GetMethodID(jenv, hashClass, "<init>", "()V");
result = (*jenv)->NewObject(jenv, hashClass, init);
put = (*jenv)->GetMethodID(jenv, hashClass, "put",
"(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
/* Iterate through hash */
zend_hash_internal_pointer_reset(Z_ARRVAL_P(arg));
while(zend_hash_get_current_data(Z_ARRVAL_P(arg), (void**)&value) == SUCCESS) {
jval = _java_makeObject(*value TSRMLS_CC);
switch (zend_hash_get_current_key(Z_ARRVAL_P(arg), &string_key, &num_key, 0)) {
case HASH_KEY_IS_STRING:
Z_TYPE(key) = IS_STRING;
Z_STRVAL(key) = string_key;
Z_STRLEN(key) = strlen(string_key);
jkey = _java_makeObject(&key TSRMLS_CC);
break;
case HASH_KEY_IS_LONG:
Z_TYPE(key) = IS_LONG;
Z_LVAL(key) = num_key;
jkey = _java_makeObject(&key TSRMLS_CC);
break;
default: /* HASH_KEY_NON_EXISTANT */
jkey = 0;
}
jold = (*jenv)->CallObjectMethod(jenv, result, put, jkey, jval);
if (Z_TYPE_PP(value) != IS_OBJECT) (*jenv)->DeleteLocalRef(jenv, jval);
zend_hash_move_forward(Z_ARRVAL_P(arg));
}
break;
}
default:
result=0;
}
return result;
}
/* }}} */
/***************************************************************************/
/* {{{ _java_makeArray
*/
static jobjectArray _java_makeArray(int argc, pval** argv TSRMLS_DC)
{
JNIEnv *jenv = JG(jenv);
jclass objectClass = (*jenv)->FindClass(jenv, "java/lang/Object");
jobjectArray result = (*jenv)->NewObjectArray(jenv, argc, objectClass, 0);
jobject arg;
int i;
for (i=0; i<argc; i++) {
arg = _java_makeObject(argv[i] TSRMLS_CC);
(*jenv)->SetObjectArrayElement(jenv, result, i, arg);
if (Z_TYPE_P(argv[i]) != IS_OBJECT) (*jenv)->DeleteLocalRef(jenv, arg);
}
return result;
}
/* }}} */
/* {{{ checkError
*/
static int checkError(pval *value)
{
if (Z_TYPE_P(value) == IS_EXCEPTION) {
php_error(E_WARNING, "%s", Z_STRVAL_P(value));
efree(Z_STRVAL_P(value));
ZVAL_FALSE(value);
return 1;
};
return 0;
}
/* }}} */
/***************************************************************************/
/* {{{ java_call_function_handler
*/
/*
* Invoke a method on an object. If method name is "java", create a new
* object instead.
*/
void java_call_function_handler(INTERNAL_FUNCTION_PARAMETERS, zend_property_reference *property_reference)
{
JNIEnv *jenv;
pval *object = property_reference->object;
zend_overloaded_element *function_name = (zend_overloaded_element *)
property_reference->elements_list->tail->data;
int arg_count = ZEND_NUM_ARGS();
jlong result = 0;
pval **arguments = (pval **) emalloc(sizeof(pval *)*arg_count);
getParametersArray(ht, arg_count, arguments);
if (!JG(jenv)) jvm_create(TSRMLS_C);
if (!JG(jenv)) return;
jenv = JG(jenv);
if (!strcmp("java", Z_STRVAL(function_name->element))) {
/* construct a Java object:
First argument is the class name. Any additional arguments will
be treated as constructor parameters. */
jmethodID co = (*jenv)->GetMethodID(jenv, JG(reflect_class), "CreateObject",
"(Ljava/lang/String;[Ljava/lang/Object;J)V");
jstring className;
result = (jlong)(long)object;
if (ZEND_NUM_ARGS() < 1) {
php_error(E_ERROR, "Missing classname in new Java() call");
return;
}
className=(*jenv)->NewStringUTF(jenv, Z_STRVAL_P(arguments[0]));
(*jenv)->CallVoidMethod(jenv, JG(php_reflect), co,
className, _java_makeArray(arg_count-1, arguments+1 TSRMLS_CC), result);
(*jenv)->DeleteLocalRef(jenv, className);
} else {
pval **handle;
int type;
jobject obj;
jstring method;
/* invoke a method on the given object */
jmethodID invoke = (*jenv)->GetMethodID(jenv, JG(reflect_class), "Invoke",
"(Ljava/lang/Object;Ljava/lang/String;[Ljava/lang/Object;J)V");
zend_hash_index_find(Z_OBJPROP_P(object), 0, (void**) &handle);
obj = zend_list_find(Z_LVAL_PP(handle), &type);
method = (*jenv)->NewStringUTF(jenv, Z_STRVAL(function_name->element));
result = (jlong)(long)return_value;
(*jenv)->CallVoidMethod(jenv, JG(php_reflect), invoke,
obj, method, _java_makeArray(arg_count, arguments TSRMLS_CC), result);
(*jenv)->DeleteLocalRef(jenv, method);
}
efree(arguments);
pval_destructor(&function_name->element);
checkError((pval*)(long)result);
}
/* }}} */
/***************************************************************************/
/* {{{ proto object java_last_exception_get(void)
Get last Java exception */
PHP_FUNCTION(java_last_exception_get)
{
jlong result = 0;
jmethodID lastEx;
if (ZEND_NUM_ARGS()!=0) WRONG_PARAM_COUNT;
result = (jlong)(long)return_value;
lastEx = (*JG(jenv))->GetMethodID(JG(jenv), JG(reflect_class),
"lastException", "(J)V");
(*JG(jenv))->CallVoidMethod(JG(jenv), JG(php_reflect), lastEx, result);
}
/* }}} */
/***************************************************************************/
/* {{{ proto void java_last_exception_clear(void)
Clear last java extension */
PHP_FUNCTION(java_last_exception_clear)
{
jlong result = 0;
jmethodID clearEx;
if (ZEND_NUM_ARGS()!=0) WRONG_PARAM_COUNT;
result = (jlong)(long)return_value;
clearEx = (*JG(jenv))->GetMethodID(JG(jenv), JG(reflect_class),
"clearException", "()V");
(*JG(jenv))->CallVoidMethod(JG(jenv), JG(php_reflect), clearEx);
}
/* }}} */
/***************************************************************************/
/* {{{ _java_getset_property
*/
static pval _java_getset_property
(zend_property_reference *property_reference, jobjectArray value TSRMLS_DC)
{
pval presult;
jlong result = 0;
pval **pobject;
jobject obj;
int type;
/* get the property name */
zend_llist_element *element = property_reference->elements_list->head;
zend_overloaded_element *property=(zend_overloaded_element *)element->data;
jstring propName;
JNIEnv *jenv;
jenv = JG(jenv);
propName = (*jenv)->NewStringUTF(jenv, Z_STRVAL(property->element));
/* get the object */
zend_hash_index_find(Z_OBJPROP_P(property_reference->object),
0, (void **) &pobject);
obj = zend_list_find(Z_LVAL_PP(pobject), &type);
result = (jlong)(long) &presult;
Z_TYPE(presult) = IS_NULL;
if (!obj || (type!=le_jobject)) {
php_error(E_ERROR,
"Attempt to access a Java property on a non-Java object");
} else {
/* invoke the method */
jmethodID gsp = (*jenv)->GetMethodID(jenv, JG(reflect_class), "GetSetProp",
"(Ljava/lang/Object;Ljava/lang/String;[Ljava/lang/Object;J)V");
(*jenv)->CallVoidMethod
(jenv, JG(php_reflect), gsp, obj, propName, value, result);
}
(*jenv)->DeleteLocalRef(jenv, propName);
pval_destructor(&property->element);
return presult;
}
/* }}} */
/* {{{ java_get_property_handler
*/
pval java_get_property_handler(zend_property_reference *property_reference)
{
pval presult;
TSRMLS_FETCH();
presult = _java_getset_property(property_reference, 0 TSRMLS_CC);
checkError(&presult);
return presult;
}
/* }}} */
/* {{{ java_set_property_handler
*/
int java_set_property_handler(zend_property_reference *property_reference, pval *value)
{
pval presult;
TSRMLS_FETCH();
presult = _java_getset_property(property_reference, _java_makeArray(1, &value TSRMLS_CC) TSRMLS_CC);
return checkError(&presult) ? FAILURE : SUCCESS;
}
/* }}} */
/***************************************************************************/
/* {{{ _php_java_destructor
*/
static void _php_java_destructor(zend_rsrc_list_entry *rsrc TSRMLS_DC)
{
void *jobject = (void *)rsrc->ptr;
if (JG(jenv)) (*JG(jenv))->DeleteGlobalRef(JG(jenv), jobject);
}
/* }}} */
/* {{{ alloc_java_globals_ctor
*/
static void alloc_java_globals_ctor(zend_java_globals *java_globals TSRMLS_DC)
{
memset(java_globals, 0, sizeof(zend_java_globals));
}
/* }}} */
/* {{{ PHP_MINIT_FUNCTION
*/
PHP_MINIT_FUNCTION(java)
{
INIT_OVERLOADED_CLASS_ENTRY(java_class_entry, "java", NULL,
java_call_function_handler,
java_get_property_handler,
java_set_property_handler);
zend_register_internal_class(&java_class_entry TSRMLS_CC);
le_jobject = zend_register_list_destructors_ex(_php_java_destructor, NULL, "java", module_number);
REGISTER_INI_ENTRIES();
if (!classpath) classpath = getenv("CLASSPATH");
if (!libpath) {
libpath=PG(extension_dir);
}
ZEND_INIT_MODULE_GLOBALS(java, alloc_java_globals_ctor, NULL);
return SUCCESS;
}
/* }}} */
/* {{{ PHP_MSHUTDOWN_FUNCTION
*/
PHP_MSHUTDOWN_FUNCTION(java)
{
UNREGISTER_INI_ENTRIES();
if (JG(jvm)) jvm_destroy(TSRMLS_C);
return SUCCESS;
}
/* }}} */
function_entry java_functions[] = {
PHP_FE(java_last_exception_get, NULL)
PHP_FE(java_last_exception_clear, NULL)
{NULL, NULL, NULL}
};
static PHP_MINFO_FUNCTION(java) {
DISPLAY_INI_ENTRIES();
}
zend_module_entry java_module_entry = {
STANDARD_MODULE_HEADER,
"java",
java_functions,
PHP_MINIT(java),
PHP_MSHUTDOWN(java),
NULL,
NULL,
PHP_MINFO(java),
NO_VERSION_YET,
STANDARD_MODULE_PROPERTIES
};
ZEND_GET_MODULE(java)
/***************************************************************************/
/* {{{ Java_net_php_reflect_setResultFromString
*/
JNIEXPORT void JNICALL Java_net_php_reflect_setResultFromString
(JNIEnv *jenv, jclass self, jlong result, jbyteArray jvalue)
{
jboolean isCopy;
jbyte *value = (*jenv)->GetByteArrayElements(jenv, jvalue, &isCopy);
pval *presult = (pval*)(long)result;
Z_TYPE_P(presult)=IS_STRING;
Z_STRLEN_P(presult)=(*jenv)->GetArrayLength(jenv, jvalue);
Z_STRVAL_P(presult)=emalloc(Z_STRLEN_P(presult)+1);
memcpy(Z_STRVAL_P(presult), value, Z_STRLEN_P(presult));
Z_STRVAL_P(presult)[Z_STRLEN_P(presult)]=0;
if (isCopy) (*jenv)->ReleaseByteArrayElements(jenv, jvalue, value, 0);
}
/* }}} */
/* {{{ Java_net_php_reflect_setResultFromLong
*/
JNIEXPORT void JNICALL Java_net_php_reflect_setResultFromLong
(JNIEnv *jenv, jclass self, jlong result, jlong value)
{
pval *presult = (pval*)(long)result;
Z_TYPE_P(presult)=IS_LONG;
Z_LVAL_P(presult)=(long)value;
}
/* }}} */
/* {{{ Java_net_php_reflect_setResultFromDouble
*/
JNIEXPORT void JNICALL Java_net_php_reflect_setResultFromDouble
(JNIEnv *jenv, jclass self, jlong result, jdouble value)
{
pval *presult = (pval*)(long)result;
Z_TYPE_P(presult)=IS_DOUBLE;
Z_DVAL_P(presult)=value;
}
/* }}} */
/* {{{ Java_net_php_reflect_setResultFromBoolean
*/
JNIEXPORT void JNICALL Java_net_php_reflect_setResultFromBoolean
(JNIEnv *jenv, jclass self, jlong result, jboolean value)
{
pval *presult = (pval*)(long)result;
Z_TYPE_P(presult)=IS_BOOL;
Z_LVAL_P(presult)=value;
}
/* }}} */
/* {{{ Java_net_php_reflect_setResultFromObject
*/
JNIEXPORT void JNICALL Java_net_php_reflect_setResultFromObject
(JNIEnv *jenv, jclass self, jlong result, jobject value)
{
/* wrapper the java object in a pval object */
pval *presult = (pval*)(long)result;
pval *handle;
TSRMLS_FETCH();
if (Z_TYPE_P(presult) != IS_OBJECT) {
object_init_ex(presult, &java_class_entry);
presult->is_ref=1;
presult->refcount=1;
}
ALLOC_ZVAL(handle);
Z_TYPE_P(handle) = IS_LONG;
Z_LVAL_P(handle) =
zend_list_insert((*jenv)->NewGlobalRef(jenv, value), le_jobject);
pval_copy_constructor(handle);
INIT_PZVAL(handle);
zend_hash_index_update(Z_OBJPROP_P(presult), 0, &handle, sizeof(pval *), NULL);
}
/* }}} */
/* {{{ Java_net_php_reflect_setResultFromArray
*/
JNIEXPORT void JNICALL Java_net_php_reflect_setResultFromArray
(JNIEnv *jenv, jclass self, jlong result)
{
array_init( (pval*)(long)result );
}
/* }}} */
/* {{{ Java_net_php_reflect_nextElement
*/
JNIEXPORT jlong JNICALL Java_net_php_reflect_nextElement
(JNIEnv *jenv, jclass self, jlong array)
{
pval *result;
pval *handle = (pval*)(long)array;
ALLOC_ZVAL(result);
zend_hash_next_index_insert(Z_ARRVAL_P(handle), &result, sizeof(zval *), NULL);
return (jlong)(long)result;
}
/* }}} */
/* {{{ Java_net_php_reflect_hashIndexUpdate
*/
JNIEXPORT jlong JNICALL Java_net_php_reflect_hashIndexUpdate
(JNIEnv *jenv, jclass self, jlong array, jlong key)
{
pval *result;
pval *handle = (pval*)(long)array;
ALLOC_ZVAL(result);
zend_hash_index_update(Z_ARRVAL_P(handle), (unsigned long)key,
&result, sizeof(zval *), NULL);
return (jlong)(long)result;
}
/* }}} */
/* {{{ Java_net_php_reflect_hashUpdate
*/
JNIEXPORT jlong JNICALL Java_net_php_reflect_hashUpdate
(JNIEnv *jenv, jclass self, jlong array, jbyteArray key)
{
pval *result;
pval pkey;
pval *handle = (pval*)(long)array;
ALLOC_ZVAL(result);
Java_net_php_reflect_setResultFromString(jenv, self, (jlong)(long)&pkey, key);
zend_hash_update(Z_ARRVAL_P(handle), Z_STRVAL(pkey), Z_STRLEN(pkey)+1,
&result, sizeof(zval *), NULL);
return (jlong)(long)result;
}
/* }}} */
/* {{{ Java_net_php_reflect_setException
*/
JNIEXPORT void JNICALL Java_net_php_reflect_setException
(JNIEnv *jenv, jclass self, jlong result, jbyteArray value)
{
pval *presult = (pval*)(long)result;
Java_net_php_reflect_setResultFromString(jenv, self, result, value);
Z_TYPE_P(presult)=IS_EXCEPTION;
}
/* }}} */
/* {{{ Java_net_php_reflect_setEnv
*/
JNIEXPORT void JNICALL Java_net_php_reflect_setEnv
(JNIEnv *newJenv, jclass self TSRMLS_DC)
{
jobject local_php_reflect;
JG(jenv)=newJenv;
if (!self) self = (*JG(jenv))->FindClass(JG(jenv), "net/php/reflect");
JG(reflect_class) = self;
if (JG(php_reflect)) (*JG(jenv))->DeleteGlobalRef(JG(jenv), JG(php_reflect));
local_php_reflect = (*JG(jenv))->AllocObject(JG(jenv), JG(reflect_class));
JG(php_reflect) = (*JG(jenv))->NewGlobalRef(JG(jenv), local_php_reflect);
}
/* }}} */
/*
* Local variables:
* tab-width: 4
* c-basic-offset: 4
* End:
* vim600: sw=4 ts=4 fdm=marker
* vim<600: sw=4 ts=4
*/

View File

@ -1,254 +0,0 @@
# Microsoft Developer Studio Project File - Name="java" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
CFG=java - Win32 Debug_TS
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
!MESSAGE use the Export Makefile command and run
!MESSAGE
!MESSAGE NMAKE /f "java.mak".
!MESSAGE
!MESSAGE You can specify a configuration when running NMAKE
!MESSAGE by defining the macro CFG on the command line. For example:
!MESSAGE
!MESSAGE NMAKE /f "java.mak" CFG="java - Win32 Debug_TS"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "java - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "java - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "java - Win32 Debug_TS" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "java - Win32 Release_TS" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE
# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
MTL=midl.exe
RSC=rc.exe
!IF "$(CFG)" == "java - Win32 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "..\..\Release"
# PROP BASE Intermediate_Dir "..\..\Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "..\..\Release"
# PROP Intermediate_Dir "..\..\Release"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MD /W3 /GX /O2 /D "PHP_WIN32" /D "ZEND_WIN32" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /YX /FD /c
# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\.." /I "..\..\Zend" /I "$(JAVA_HOME)\include\win32" /I "$(JAVA_HOME)\include" /I "..\..\..\bindlib_w32" /D "NDEBUG" /D ZEND_DEBUG=0 /D "PHP_WIN32" /D "ZEND_WIN32" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMPILE_DL_JAVA" /D HAVE_JAVA=1 /YX /FD /c
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x40d /d "NDEBUG"
# ADD RSC /l 0x40d /d "NDEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /out:"..\..\Release/php_java.dll" /libpath:"$(JAVA_HOME)\lib" /libpath:"..\..\Release"
!ELSEIF "$(CFG)" == "java - Win32 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "..\..\Debug"
# PROP BASE Intermediate_Dir "..\..\Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "..\..\Debug"
# PROP Intermediate_Dir "..\..\Debug"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /D "PHP_WIN32" /D "ZEND_WIN32" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /YX /FD /GZ /c
# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\.." /I "..\..\Zend" /I "$(JAVA_HOME)\include\win32" /I "$(JAVA_HOME)\include" /I "..\..\..\bindlib_w32" /D "_DEBUG" /D ZEND_DEBUG=1 /D "PHP_WIN32" /D "ZEND_WIN32" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMPILE_DL_JAVA" /D HAVE_JAVA=1 /FR /YX /FD /GZ /c
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x40d /d "_DEBUG"
# ADD RSC /l 0x40d /d "_DEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /out:"..\..\Debug/php_java.dll" /pdbtype:sept /libpath:"$(JAVA_HOME)\lib" /libpath:"..\..\Debug"
!ELSEIF "$(CFG)" == "java - Win32 Debug_TS"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "..\..\Debug_TS"
# PROP BASE Intermediate_Dir "..\..\Debug_TS"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "..\..\Debug_TS"
# PROP Intermediate_Dir "..\..\Debug_TS"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\.." /I "..\..\..\Zend" /I "$(JAVA_HOME)\include\win32" /I "$(JAVA_HOME)\include" /I "..\..\..\bindlib_w32" /D "_DEBUG" /D "PHP_WIN32" /D "ZEND_WIN32" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMPILE_DL_JAVA" /FR /YX /FD /GZ /c
# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\..\\" /I "..\..\main" /I "..\..\TSRM" /I "..\..\Zend" /I "$(JAVA_HOME)\include\win32" /I "$(JAVA_HOME)\include" /I "..\..\..\bindlib_w32" /D "_DEBUG" /D ZEND_DEBUG=1 /D "ZTS" /D "PHP_WIN32" /D "ZEND_WIN32" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMPILE_DL_JAVA" /D HAVE_JAVA=1 /FR /YX /FD /GZ /c
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x40d /d "_DEBUG"
# ADD RSC /l 0x40d /d "_DEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib php4ts_debug.lib /nologo /dll /debug /machine:I386 /out:"..\..\Debug_TS/php_java.dll" /pdbtype:sept /libpath:"$(JAVA_HOME)\lib" /libpath:"..\..\Debug_TS"
!ELSEIF "$(CFG)" == "java - Win32 Release_TS"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "..\..\Release_TS"
# PROP BASE Intermediate_Dir "..\..\Release_TS"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "..\..\Release_TS"
# PROP Intermediate_Dir "..\..\Release_TS"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MD /W3 /GX /O2 /I "..\.." /I "..\..\..\Zend" /I "$(JAVA_HOME)\include\win32" /I "$(JAVA_HOME)\include" /I "..\..\..\bindlib_w32" /D "NDEBUG" /D "PHP_WIN32" /D "ZEND_WIN32" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMPILE_DL_JAVA" /YX /FD /c
# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\..\\" /I "..\..\main" /I "..\..\TSRM" /I "..\..\Zend" /I "$(JAVA_HOME)\include\win32" /I "$(JAVA_HOME)\include" /I "..\..\..\bindlib_w32" /D "NDEBUG" /D ZEND_DEBUG=0 /D "ZTS" /D "PHP_WIN32" /D "ZEND_WIN32" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMPILE_DL_JAVA" /D HAVE_JAVA=1 /YX /FD /c
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x40d /d "NDEBUG"
# ADD RSC /l 0x40d /d "NDEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib php4ts.lib /nologo /dll /machine:I386 /out:"..\..\Release_TS/php_java.dll" /libpath:"$(JAVA_HOME)\lib" /libpath:"..\..\Release_TS" /libpath:"..\..\Release_TS_Inline"
!ENDIF
# Begin Target
# Name "java - Win32 Release"
# Name "java - Win32 Debug"
# Name "java - Win32 Debug_TS"
# Name "java - Win32 Release_TS"
# Begin Group "Source Files"
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
# Begin Source File
SOURCE=.\java.c
# End Source File
# End Group
# Begin Group "Header Files"
# PROP Default_Filter "h;hpp;hxx;hm;inl"
# Begin Source File
SOURCE=.\php_java.h
# End Source File
# End Group
# Begin Group "Java Files"
# PROP Default_Filter "java"
# Begin Source File
SOURCE=.\reflect.java
!IF "$(CFG)" == "java - Win32 Release"
# Begin Custom Build
OutDir=.\..\..\Release
InputPath=.\reflect.java
"$(OutDir)\php_java.jar" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
if not exist net mkdir net
if not exist net\php mkdir net\php
copy $(InputPath) net\php > nul
echo library=php_java>net\php\reflect.properties
$(JAVA_HOME)\bin\javac net\php\reflect.java
$(JAVA_HOME)\bin\jar c0f $(OutDir)\php_java.jar net\php\*.class net\php\*.properties
erase net\php\reflect.*
rmdir net\php
rmdir net
# End Custom Build
!ELSEIF "$(CFG)" == "java - Win32 Debug"
# Begin Custom Build
OutDir=.\..\..\Debug
InputPath=.\reflect.java
"$(OutDir)\php_java.jar" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
if not exist net mkdir net
if not exist net\php mkdir net\php
copy $(InputPath) net\php > nul
echo library=php_java>net\php\reflect.properties
$(JAVA_HOME)\bin\javac -g net\php\reflect.java
$(JAVA_HOME)\bin\jar c0f $(OutDir)\php_java.jar net\php\*.class net\php\*.properties
erase net\php\reflect.*
rmdir net\php
rmdir net
# End Custom Build
!ELSEIF "$(CFG)" == "java - Win32 Debug_TS"
# Begin Custom Build
OutDir=.\..\..\Debug_TS
InputPath=.\reflect.java
"$(OutDir)\php_java.jar" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
if not exist net mkdir net
if not exist net\php mkdir net\php
copy $(InputPath) net\php > nul
echo library=php_java>net\php\reflect.properties
$(JAVA_HOME)\bin\javac -g net\php\reflect.java
$(JAVA_HOME)\bin\jar c0f $(OutDir)\php_java.jar net\php\*.class net\php\*.properties
erase net\php\reflect.*
rmdir net\php
rmdir net
# End Custom Build
!ELSEIF "$(CFG)" == "java - Win32 Release_TS"
# Begin Custom Build
OutDir=.\..\..\Release_TS
InputPath=.\reflect.java
"$(OutDir)\php_java.jar" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
if not exist net mkdir net
if not exist net\php mkdir net\php
copy $(InputPath) net\php > nul
echo library=php_java>net\php\reflect.properties
$(JAVA_HOME)\bin\javac net\php\reflect.java
$(JAVA_HOME)\bin\jar c0f $(OutDir)\php_java.jar net\php\*.class net\php\*.properties
erase net\php\reflect.*
rmdir net\php
rmdir net
# End Custom Build
!ENDIF
# End Source File
# End Group
# Begin Source File
SOURCE=.\jtest.php
# End Source File
# End Target
# End Project

View File

@ -1,27 +0,0 @@
<?
// This example is only intented to be run as a CGI.
$frame = new Java("java.awt.Frame", "Zend");
$button = new Java("java.awt.Button", "Hello Java world!");
$frame->add("North", $button);
$frame->validate();
$frame->pack();
$frame->visible = True;
$thread = new Java("java.lang.Thread");
$thread->sleep(10000);
$frame->dispose();
// Odd behavior noted with Sun JVMs:
//
// 1) $thread->destroy() will fail with a NoSuchMethodError exception.
// 2) The call to (*jvm)->DestroyJVM(jvm) made when PHP terminates
// will hang, unless _BOTH_ the calls to pack and setVisible above
// are removed.
//
// Even more odd: both effects are seen with a 100% Java implementation
// of the above!
?>

View File

@ -1,17 +0,0 @@
<html>
<?
$system = new Java("java.lang.System");
print "Java version=".$system->getProperty("java.version")." <br>\n";
print "Java vendor=".$system->getProperty("java.vendor")." <p>\n\n";
print "OS=".$system->getProperty("os.name")." ".
$system->getProperty("os.version")." on ".
$system->getProperty("os.arch")." <br>\n";
$formatter = new Java("java.text.SimpleDateFormat",
"EEEE, MMMM dd, yyyy 'at' h:mm:ss a zzzz");
print $formatter->format(new Java("java.util.Date"))."\n";
?>
</html>

View File

@ -1,419 +0,0 @@
/*
+----------------------------------------------------------------------+
| PHP Version 4 |
+----------------------------------------------------------------------+
| Copyright (c) 1997-2002 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 2.02 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.php.net/license/2_02.txt. |
| If you did not receive a copy of the PHP license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@php.net so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Author: Sam Ruby (rubys@us.ibm.com) |
+----------------------------------------------------------------------+
*/
/* $Id$ */
package net.php;
import java.lang.reflect.*;
import java.util.*;
import java.beans.*;
public class reflect {
static { loadLibrary("reflect"); }
protected static void loadLibrary(String property) {
try {
ResourceBundle bundle = ResourceBundle.getBundle("net.php."+property);
System.loadLibrary(bundle.getString("library"));
} catch (Exception e) {
e.printStackTrace();
}
}
//
// Native methods
//
private static native void setResultFromString(long result, byte value[]);
private static native void setResultFromLong(long result, long value);
private static native void setResultFromDouble(long result, double value);
private static native void setResultFromBoolean(long result, boolean value);
private static native void setResultFromObject(long result, Object value);
private static native void setResultFromArray(long result);
private static native long nextElement(long array);
private static native long hashUpdate(long array, byte key[]);
private static native long hashIndexUpdate(long array, long key);
private static native void setException(long result, byte value[]);
public static native void setEnv();
//
// Helper routines which encapsulate the native methods
//
public static void setResult(long result, Object value) {
if (value == null) return;
if (value instanceof java.lang.String) {
setResultFromString(result, ((String)value).getBytes());
} else if (value instanceof java.lang.Number) {
if (value instanceof java.lang.Integer ||
value instanceof java.lang.Short ||
value instanceof java.lang.Byte) {
setResultFromLong(result, ((Number)value).longValue());
} else {
/* Float, Double, BigDecimal, BigInteger, Double, Long, ... */
setResultFromDouble(result, ((Number)value).doubleValue());
}
} else if (value instanceof java.lang.Boolean) {
setResultFromBoolean(result, ((Boolean)value).booleanValue());
} else if (value.getClass().isArray()) {
long length = Array.getLength(value);
setResultFromArray(result);
for (int i=0; i<length; i++) {
setResult(nextElement(result), Array.get(value, i));
}
} else if (value instanceof java.util.Hashtable) {
Hashtable ht = (Hashtable) value;
setResultFromArray(result);
for (Enumeration e = ht.keys(); e.hasMoreElements(); ) {
Object key = e.nextElement();
long slot;
if (key instanceof Number &&
!(key instanceof Double || key instanceof Float))
slot = hashIndexUpdate(result, ((Number)key).longValue());
else
slot = hashUpdate(result, key.toString().getBytes());
setResult(slot, ht.get(key));
}
} else {
setResultFromObject(result, value);
}
}
Throwable lastException = null;
void lastException(long result) {
setResult(result, lastException);
}
void clearException() {
lastException = null;
}
void setException(long result, Throwable e) {
if (e instanceof InvocationTargetException) {
Throwable t = ((InvocationTargetException)e).getTargetException();
if (t!=null) e=t;
}
lastException = e;
setException(result, e.toString().getBytes());
}
//
// Create an new instance of a given class
//
public void CreateObject(String name, Object args[], long result) {
try {
Vector matches = new Vector();
Constructor cons[] = Class.forName(name).getConstructors();
for (int i=0; i<cons.length; i++) {
if (cons[i].getParameterTypes().length == args.length) {
matches.addElement(cons[i]);
}
}
Constructor selected = (Constructor)select(matches, args);
if (selected == null) {
if (args.length > 0) {
throw new InstantiationException("No matching constructor found");
} else {
// for classes which have no visible constructor, return the class
// useful for classes like java.lang.System and java.util.Calendar.
setResult(result, Class.forName(name));
return;
}
}
Object coercedArgs[] = coerce(selected.getParameterTypes(), args);
setResultFromObject(result, selected.newInstance(coercedArgs));
} catch (Exception e) {
setException(result, e);
}
}
//
// Select the best match from a list of methods
//
private static Object select(Vector methods, Object args[]) {
if (methods.size() == 1) return methods.firstElement();
Object selected = null;
int best = Integer.MAX_VALUE;
for (Enumeration e = methods.elements(); e.hasMoreElements(); ) {
Object element = e.nextElement();
int weight=0;
Class parms[] = (element instanceof Method) ?
((Method)element).getParameterTypes() :
((Constructor)element).getParameterTypes();
for (int i=0; i<parms.length; i++) {
if (parms[i].isInstance(args[i])) {
for (Class c=parms[i]; (c=c.getSuperclass()) != null; ) {
if (!c.isInstance(args[i])) break;
weight++;
}
} else if (parms[i].isAssignableFrom(java.lang.String.class)) {
if (!(args[i] instanceof byte[]) && !(args[i] instanceof String))
weight+=9999;
} else if (parms[i].isArray()) {
if (args[i] instanceof java.util.Hashtable)
weight+=256;
else
weight+=9999;
} else if (parms[i].isPrimitive()) {
Class c=parms[i];
if (args[i] instanceof Number) {
if (c==Boolean.TYPE) weight+=5;
if (c==Character.TYPE) weight+=4;
if (c==Byte.TYPE) weight+=3;
if (c==Short.TYPE) weight+=2;
if (c==Integer.TYPE) weight++;
if (c==Float.TYPE) weight++;
} else if (args[i] instanceof Boolean) {
if (c!=Boolean.TYPE) weight+=9999;
} else if (args[i] instanceof String) {
if (c== Character.TYPE || ((String)args[i]).length()>0)
weight+=((String)args[i]).length();
else
weight+=64;
} else {
weight+=9999;
}
} else {
weight+=9999;
}
}
if (weight < best) {
if (weight == 0) return element;
best = weight;
selected = element;
}
}
return selected;
}
//
// Coerce arguments when possible to conform to the argument list.
// Java's reflection will automatically do widening conversions,
// unfortunately PHP only supports wide formats, so to be practical
// some (possibly lossy) conversions are required.
//
private static Object[] coerce(Class parms[], Object args[]) {
Object result[] = args;
for (int i=0; i<args.length; i++) {
if (args[i] instanceof byte[] && !parms[i].isArray()) {
Class c = parms[i];
String s = new String((byte[])args[i]);
result[i] = s;
try {
if (c == Boolean.TYPE) result[i]=new Boolean(s);
if (c == Byte.TYPE) result[i]=new Byte(s);
if (c == Short.TYPE) result[i]=new Short(s);
if (c == Integer.TYPE) result[i]=new Integer(s);
if (c == Float.TYPE) result[i]=new Float(s);
if (c == Long.TYPE) result[i]=new Long(s);
if (c == Character.TYPE && s.length()>0)
result[i]=new Character(s.charAt(0));
} catch (NumberFormatException n) {
// oh well, we tried!
}
} else if (args[i] instanceof Number && parms[i].isPrimitive()) {
if (result==args) result=(Object[])result.clone();
Class c = parms[i];
Number n = (Number)args[i];
if (c == Boolean.TYPE) result[i]=new Boolean(0.0!=n.floatValue());
if (c == Byte.TYPE) result[i]=new Byte(n.byteValue());
if (c == Short.TYPE) result[i]=new Short(n.shortValue());
if (c == Integer.TYPE) result[i]=new Integer(n.intValue());
if (c == Float.TYPE) result[i]=new Float(n.floatValue());
if (c == Long.TYPE && !(n instanceof Long))
result[i]=new Long(n.longValue());
} else if (args[i] instanceof Hashtable && parms[i].isArray()) {
try {
Hashtable ht = (Hashtable)args[i];
int size = ht.size();
// Verify that the keys are Long, and determine maximum
for (Enumeration e = ht.keys(); e.hasMoreElements(); ) {
int index = ((Long)e.nextElement()).intValue();
if (index >= size) size = index+1;
}
Object tempArray[] = new Object[size];
Class tempTarget[] = new Class[size];
Class targetType = parms[i].getComponentType();
// flatten the hash table into an array
for (int j=0; j<size; j++) {
tempArray[j] = ht.get(new Long(j));
if (tempArray[j] == null && targetType.isPrimitive())
throw new Exception("bail");
tempTarget[j] = targetType;
}
// coerce individual elements into the target type
Object coercedArray[] = coerce(tempTarget, tempArray);
// copy the results into the desired array type
Object array = Array.newInstance(targetType,size);
for (int j=0; j<size; j++) {
Array.set(array, j, coercedArray[j]);
}
result[i]=array;
} catch (Exception e) {
// leave result[i] alone...
}
}
}
return result;
}
//
// Invoke a method on a given object
//
public void Invoke
(Object object, String method, Object args[], long result)
{
try {
Vector matches = new Vector();
// gather
for (Class jclass = object.getClass();;jclass=(Class)object) {
while (!Modifier.isPublic(jclass.getModifiers())) {
// OK, some joker gave us an instance of a non-public class
// This often occurs in the case of enumerators
// Substitute the first public interface in its place,
// and barring that, try the superclass
Class interfaces[] = jclass.getInterfaces();
jclass=jclass.getSuperclass();
for (int i=interfaces.length; i-->0;) {
if (Modifier.isPublic(interfaces[i].getModifiers())) {
jclass=interfaces[i];
}
}
}
Method methods[] = jclass.getMethods();
for (int i=0; i<methods.length; i++) {
if (methods[i].getName().equalsIgnoreCase(method) &&
methods[i].getParameterTypes().length == args.length) {
matches.addElement(methods[i]);
}
}
// try a second time with the object itself, if it is of type Class
if (!(object instanceof Class) || (jclass==object)) break;
}
Method selected = (Method)select(matches, args);
if (selected == null) throw new NoSuchMethodException(method);
Object coercedArgs[] = coerce(selected.getParameterTypes(), args);
setResult(result, selected.invoke(object, coercedArgs));
} catch (Exception e) {
setException(result, e);
}
}
//
// Get or Set a property
//
public void GetSetProp
(Object object, String prop, Object args[], long result)
{
try {
for (Class jclass = object.getClass();;jclass=(Class)object) {
while (!Modifier.isPublic(jclass.getModifiers())) {
// OK, some joker gave us an instance of a non-public class
// Substitute the first public interface in its place,
// and barring that, try the superclass
Class interfaces[] = jclass.getInterfaces();
jclass=jclass.getSuperclass();
for (int i=interfaces.length; i-->0;) {
if (Modifier.isPublic(interfaces[i].getModifiers())) {
jclass=interfaces[i];
}
}
}
BeanInfo beanInfo = Introspector.getBeanInfo(jclass);
PropertyDescriptor props[] = beanInfo.getPropertyDescriptors();
for (int i=0; i<props.length; i++) {
if (props[i].getName().equalsIgnoreCase(prop)) {
Method method;
if (args!=null && args.length>0) {
method=props[i].getWriteMethod();
args = coerce(method.getParameterTypes(), args);
} else {
method=props[i].getReadMethod();
}
setResult(result, method.invoke(object, args));
return;
}
}
Field jfields[] = jclass.getFields();
for (int i=0; i<jfields.length; i++) {
if (jfields[i].getName().equalsIgnoreCase(prop)) {
if (args!=null && args.length>0) {
args = coerce(new Class[] {jfields[i].getType()}, args);
jfields[i].set(object, args[0]);
} else {
setResult(result, jfields[i].get(object));
}
return;
}
}
// try a second time with the object itself, if it is of type Class
if (!(object instanceof Class) || (jclass==object)) break;
}
} catch (Exception e) {
setException(result, e);
}
}
//
// Helper routines for the C implementation
//
public Object MakeArg(boolean b) { return new Boolean(b); }
public Object MakeArg(long l) { return new Long(l); }
public Object MakeArg(double d) { return new Double(d); }
}