created mirror
This commit is contained in:
53
Java/script/Makefile
Normal file
53
Java/script/Makefile
Normal file
@@ -0,0 +1,53 @@
|
||||
PERLDIR=../../C++/script/Perl
|
||||
|
||||
|
||||
IBMCFLAGS=-Dint64_t="long long" -Dlinux -g -I/BIG/ibmjdk/include -I/BIG/ibmjdk/include/linux -I../../C++ -I../../C++/script/Perl
|
||||
CFLAGS=-g -I$(PERLDIR)
|
||||
|
||||
IBMLDFLAGS=-L/BIG/ibmjdk/lib/linux/native_threads/
|
||||
|
||||
all: classes hdr jzigzag
|
||||
|
||||
jzigzag: invoke.o zzfoo.o ZZScriptPerl.o ZZScriptAPI_1_JNI.o
|
||||
gcc -o jzigzag -export-dynamic invoke.o zzfoo.o ZZScriptPerl.o ZZScriptAPI_1_JNI.o $(IBMLDFLAGS) -ljava `perl -MExtUtils::Embed -e ldopts`
|
||||
|
||||
invoke.o: invoke.c
|
||||
gcc $(IBMCFLAGS) -c invoke.c
|
||||
|
||||
zzfoo.o: $(PERLDIR)/zzfoo.cpp
|
||||
g++ $(CFLAGS) `perl -MConfig -e 'print "$$Config{ccflags} -I$$Config{installarchlib}/CORE"'` -c -o zzfoo.o -I../../C++ $(PERLDIR)/zzfoo.cpp
|
||||
|
||||
ZZScriptPerl.o: ZZScriptPerl.cpp *.h
|
||||
g++ $(IBMCFLAGS) -c -o ZZScriptPerl.o ZZScriptPerl.cpp
|
||||
|
||||
ZZScriptAPI_1_JNI.o: ZZScriptAPI_1_JNI.cpp *.h
|
||||
g++ $(IBMCFLAGS) -c -o ZZScriptAPI_1_JNI.o ZZScriptAPI_1_JNI.cpp
|
||||
|
||||
|
||||
# all: classes hdr libZZScriptPerl.la
|
||||
|
||||
classes:
|
||||
javac -d .. *.java
|
||||
|
||||
hdr: fi_iki_lukka_ZZScriptPerl.h
|
||||
|
||||
fi_iki_lukka_ZZScriptPerl.h: ../fi/iki/lukka/ZZScriptPerl.class
|
||||
javah -jni fi.iki.lukka.ZZScriptPerl
|
||||
|
||||
# libZZScriptPerl.la: ZZScriptPerl.lo zzfoo.lo
|
||||
# libtool g++ $(CFLAGS) -o libZZScriptPerl.la ZZScriptPerl.lo zzfoo.lo `perl -MConfig -e 'print "-L$$Config{installarchlib}/CORE -lperl $$Config{libs}"'`
|
||||
#
|
||||
# # Doesn't work due to DynaLoader! ARGH!
|
||||
# #`perl -MExtUtils::Embed -e ccopts -e ldopts`
|
||||
#
|
||||
# zzfoo.lo: $(PERLDIR)/zzfoo.cpp
|
||||
# libtool g++ $(CFLAGS) `perl -MConfig -e 'print "$$Config{ccflags} -I$$Config{installarchlib}/CORE"'` -c -o zzfoo.lo -I../../C++ $(PERLDIR)/zzfoo.cpp
|
||||
#
|
||||
#
|
||||
#
|
||||
# $(PERLDIR)/zzfoo.cpp: ../../C++/script/Perl/zzfoo.xs
|
||||
# (cd $(PERLDIR); make zzfoo.cpp)
|
||||
#
|
||||
#
|
||||
# ZZScriptPerl.lo: ZZScriptPerl.cpp *.h
|
||||
# libtool g++ $(IBMCFLAGS) -c -o ZZScriptPerl.lo ZZScriptPerl.cpp
|
||||
12
Java/script/ZZId.h
Normal file
12
Java/script/ZZId.h
Normal file
@@ -0,0 +1,12 @@
|
||||
#ifndef ZZID_H
|
||||
#define ZZID_H
|
||||
|
||||
// class _jobject;
|
||||
// typedef _jobject* jobject;
|
||||
|
||||
// #define ZZId jobject
|
||||
//
|
||||
// Arghh...
|
||||
#define ZZId long
|
||||
|
||||
#endif
|
||||
31
Java/script/ZZScriptAPI_1_JNI.cpp
Normal file
31
Java/script/ZZScriptAPI_1_JNI.cpp
Normal file
@@ -0,0 +1,31 @@
|
||||
|
||||
#include <jni.h>
|
||||
#include "ZZId.h"
|
||||
#include "ZZScriptAPI_1_JNI.h"
|
||||
#include "zzfoo.h"
|
||||
|
||||
const ZZScriptAPI_1_0_JNI::meth ZZScriptAPI_1_0_JNI::names[LASTMETH_] ;
|
||||
/*
|
||||
= {
|
||||
{ "getNeighbour", "(Ljava/lang/String;I)Lfi/iki/lukka/ZZCell;" },
|
||||
{ "getHeadcell", "(Ljava/lang/String;I)Lfi/iki/lukka/ZZCell;" },
|
||||
{ "newCell", "(Ljava/lang/String;I)Lfi/iki/lukka/ZZCell;" },
|
||||
{ "delete", "()V" },
|
||||
{ "connect", "(Ljava/lang/String;Lfi/iki/lukka/ZZCell;)V" },
|
||||
{ "insert", "(Ljava/lang/String;ILfi/iki/lukka/ZZCell;)V" },
|
||||
{ "disconnect", "(Ljava/lang/String;I)V" },
|
||||
{ "getText", "()Ljava/lang/String;" },
|
||||
{ "setText" "(Ljava/lang/String;)V" },
|
||||
}; */
|
||||
/* = {
|
||||
{ "getNeighbour", "(Ljava/lang/String;I)Lfi/iki/lukka/ZZCell;" },
|
||||
{ "getHeadcell", "(Ljava/lang/String;I)Lfi/iki/lukka/ZZCell;" },
|
||||
{ "newCell", "(Ljava/lang/String;I)Lfi/iki/lukka/ZZCell;" },
|
||||
{ "delete", "()V" },
|
||||
{ "connect", "(Ljava/lang/String;Lfi/iki/lukka/ZZCell;)V" },
|
||||
{ "insert", "(Ljava/lang/String;ILfi/iki/lukka/ZZCell;)V" },
|
||||
{ "disconnect", "(Ljava/lang/String;I)V" },
|
||||
{ "getText", "()Ljava/lang/String;" },
|
||||
{ "setText" "(Ljava/lang/String;)V" },
|
||||
}; */
|
||||
|
||||
131
Java/script/ZZScriptAPI_1_JNI.h
Normal file
131
Java/script/ZZScriptAPI_1_JNI.h
Normal file
@@ -0,0 +1,131 @@
|
||||
#ifndef ZZSCRIPT_API_1_JNI_H
|
||||
#define ZZSCRIPT_API_1_JNI_H
|
||||
|
||||
#define EXC() if(env->ExceptionOccurred()) {env->ExceptionDescribe(); env->FatalError("EXCEPTION");}
|
||||
|
||||
// XXX ARGH
|
||||
// #define MID(cell,id) (env->GetMethodID(env->GetObjectClass((jobject)cell), names[id].name, names[id].sig) || (env->FatalError("NoMethod"),(jmethodID)0))
|
||||
#define MID(cell,id) (env->GetMethodID(env->GetObjectClass((jobject)cell), names[id].name, names[id].sig))
|
||||
|
||||
|
||||
#include "ZZScriptAPI_1.h"
|
||||
|
||||
class ZZScriptAPI_1_0_JNI : public ZZScriptAPI_1_0 {
|
||||
protected:
|
||||
JNIEnv *env;
|
||||
jclass zzcell;
|
||||
enum meths {
|
||||
GETNEIGH,
|
||||
HEADCELL,
|
||||
NEWCELL,
|
||||
DELETECELL,
|
||||
CONNECTCELLS,
|
||||
INSERTCELL,
|
||||
DISCONNECT,
|
||||
GETTEXT,
|
||||
SETTEXT,
|
||||
LASTMETH_
|
||||
};
|
||||
static const struct meth {char *name; char *sig;} names[LASTMETH_]
|
||||
= {
|
||||
{ "getNeighbour", "(Ljava/lang/String;I)Lfi/iki/lukka/ZZCell;" },
|
||||
{ "getHeadcell", "(Ljava/lang/String;I)Lfi/iki/lukka/ZZCell;" },
|
||||
{ "newCell", "(Ljava/lang/String;I)Lfi/iki/lukka/ZZCell;" },
|
||||
{ "delete", "()V" },
|
||||
{ "connect", "(Ljava/lang/String;Lfi/iki/lukka/ZZCell;)V" },
|
||||
{ "insert", "(Ljava/lang/String;ILfi/iki/lukka/ZZCell;)V" },
|
||||
{ "disconnect", "(Ljava/lang/String;I)V" },
|
||||
{ "getText", "()Ljava/lang/String;" },
|
||||
{ "setText", "(Ljava/lang/String;)V" },
|
||||
};
|
||||
jmethodID mids[LASTMETH_];
|
||||
public:
|
||||
ZZScriptAPI_1_0_JNI(JNIEnv *env0) {
|
||||
utfref = 0;
|
||||
strref = 0;
|
||||
env = env0;
|
||||
zzcell = env->FindClass("fi/iki/lukka/ZZCell");
|
||||
if(!zzcell) abort();
|
||||
zzcell = (jclass)env->NewGlobalRef(zzcell);
|
||||
if(!zzcell) abort();
|
||||
for(int i=0; i<LASTMETH_; i++) {
|
||||
mids[i] = env->GetMethodID(zzcell, names[i].name, names[i].sig);
|
||||
if(!mids[i]) {
|
||||
abort();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static const int verbose = 1;
|
||||
|
||||
virtual ZZId get_cell (ZZId from, const char *dim, int dir) {
|
||||
printf("CB GETCELL\n");
|
||||
long res = (long)env->CallObjectMethod((jobject)from, MID(from,GETNEIGH),
|
||||
env->NewStringUTF(dim), (jint)dir);
|
||||
EXC();
|
||||
return res;
|
||||
};
|
||||
virtual ZZId get_headcell (ZZId from, const char *dim, int dir)
|
||||
{
|
||||
printf("CB HEADCELL\n");
|
||||
EXC();
|
||||
abort();
|
||||
};
|
||||
virtual ZZId new_cell (ZZId from, const char *dim, int dir) {
|
||||
printf("CB NEWCELL\n");
|
||||
long res = (long)env->CallObjectMethod((jobject)from, MID(from,NEWCELL),
|
||||
env->NewStringUTF(dim), (jint)dir);
|
||||
EXC();
|
||||
return res;
|
||||
}
|
||||
virtual void delete_cell (ZZId cell) {
|
||||
printf("CB DELCELL\n");
|
||||
env->CallVoidMethod((jobject)cell, MID(cell,DELETECELL));
|
||||
EXC();
|
||||
};
|
||||
virtual void connect_cells (ZZId from, const char *dim, ZZId to) {
|
||||
printf("CB CONCELL\n");
|
||||
env->CallVoidMethod((jobject)from, MID(from,CONNECTCELLS),
|
||||
env->NewStringUTF(dim), (jobject)to);
|
||||
EXC();
|
||||
};
|
||||
virtual void insert_cell (ZZId where, const char *dim, int dir, ZZId what) {
|
||||
printf("CB INSCELL\n");
|
||||
env->CallVoidMethod((jobject)where, MID(where,INSERTCELL),
|
||||
env->NewStringUTF(dim), (jint)dir, (jobject)what);
|
||||
EXC();
|
||||
};
|
||||
virtual void disconnect (ZZId from, const char *dim, int dir) {
|
||||
printf("CB DISCELL\n");
|
||||
env->CallVoidMethod((jobject)from, MID(from,NEWCELL),
|
||||
env->NewStringUTF(dim), (jint)dir);
|
||||
EXC();
|
||||
};
|
||||
const char *utfref;
|
||||
jstring strref;
|
||||
virtual const char *get_text (ZZId cell) {
|
||||
printf("CB GETTEXT\n");
|
||||
if(utfref) {
|
||||
// XXX?
|
||||
env->ReleaseStringUTFChars(strref, utfref);
|
||||
}
|
||||
strref = (jstring)env->CallObjectMethod((jobject)cell, MID(cell,GETTEXT));
|
||||
utfref = env->GetStringUTFChars(strref,0);
|
||||
EXC();
|
||||
return utfref;
|
||||
};
|
||||
virtual void set_text (ZZId cell, const char *str) {
|
||||
printf("CB SETTEXT\n");
|
||||
env->CallVoidMethod((jobject)cell, MID(cell,SETTEXT),
|
||||
env->NewStringUTF(str));
|
||||
EXC();
|
||||
printf("CB SETTEXT ret\n");
|
||||
};
|
||||
virtual int popup_warning (const char *text) {
|
||||
abort();
|
||||
};
|
||||
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
55
Java/script/ZZScriptPerl.cpp
Normal file
55
Java/script/ZZScriptPerl.cpp
Normal file
@@ -0,0 +1,55 @@
|
||||
#include <jni.h>
|
||||
#include "ZZId.h"
|
||||
#include "ZZScriptAPI_1_JNI.h"
|
||||
#include "zzfoo.h"
|
||||
|
||||
static jclass zzspclass;
|
||||
static jfieldID ptrid;
|
||||
|
||||
extern "C" {
|
||||
JNIEXPORT void JNICALL Java_fi_iki_lukka_ZZScriptPerl_init
|
||||
(JNIEnv *env, jobject foo)
|
||||
{
|
||||
if(!zzspclass)
|
||||
zzspclass = (jclass)env->NewGlobalRef(env->GetObjectClass(foo));
|
||||
ptrid = env->GetFieldID(zzspclass, "ptr", "J");
|
||||
if(!ptrid) abort();
|
||||
ZZScriptAPI_1_0_JNI *j = new ZZScriptAPI_1_0_JNI(env);
|
||||
zzperl_init(j);
|
||||
env->SetLongField(foo, ptrid, (jlong)j);
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_fi_iki_lukka_ZZScriptPerl_call
|
||||
(JNIEnv *env, jobject foo, jstring code0, jobject view0, jobject
|
||||
cview0, jobject scr0, jobject cur0, jstring dimx0, jstring dimy0)
|
||||
{
|
||||
printf("ENTERING PERLCALL\n");
|
||||
ZZScriptAPI_1_0_JNI *j = (ZZScriptAPI_1_0_JNI *) env->GetLongField(foo, ptrid);
|
||||
if(!j) abort();
|
||||
char *code = (char *)env->GetStringUTFChars(code0, 0);
|
||||
char *dimx = (char *)env->GetStringUTFChars(dimx0, 0);
|
||||
char *dimy = (char *)env->GetStringUTFChars(dimy0, 0);
|
||||
|
||||
zzperl_call(code, (long)view0, (long)cview0, (long)scr0, (long)cur0, dimx, dimy);
|
||||
|
||||
env->ReleaseStringUTFChars(code0,code);
|
||||
env->ReleaseStringUTFChars(dimx0,dimx);
|
||||
env->ReleaseStringUTFChars(dimy0,dimy);
|
||||
printf("RETURNING FROM PERLCALL\n");
|
||||
|
||||
}
|
||||
|
||||
JNINativeMethod ms[2] = {
|
||||
{ "init", "()V", Java_fi_iki_lukka_ZZScriptPerl_init },
|
||||
{ "call", "(Ljava/lang/String;Lfi/iki/lukka/ZZCell;Lfi/iki/lukka/ZZCell;Lfi/iki/lukka/ZZCell;Lfi/iki/lukka/ZZCell;Ljava/lang/String;Ljava/lang/String;)V",
|
||||
Java_fi_iki_lukka_ZZScriptPerl_call }
|
||||
};
|
||||
|
||||
void zsp_install(JNIEnv *env) {
|
||||
zzspclass = env->FindClass("fi/iki/lukka/ZZScriptPerl");
|
||||
if(!zzspclass) abort();
|
||||
zzspclass = (jclass)env->NewGlobalRef(zzspclass);
|
||||
env->RegisterNatives(zzspclass, ms, 2);
|
||||
}
|
||||
|
||||
}
|
||||
9
Java/script/ZZScriptPerl.java
Normal file
9
Java/script/ZZScriptPerl.java
Normal file
@@ -0,0 +1,9 @@
|
||||
package org.gzigzag;
|
||||
|
||||
public class ZZScriptPerl {
|
||||
long ptr;
|
||||
public ZZScriptPerl() { init(); };
|
||||
public native void init();
|
||||
public native void call(String code, ZZCell view, ZZCell controlView,
|
||||
ZZCell script, ZZCell cur, String dimX, String dimY);
|
||||
}
|
||||
76
Java/script/invoke.c
Normal file
76
Java/script/invoke.c
Normal file
@@ -0,0 +1,76 @@
|
||||
// Copied from
|
||||
// http://java.sun.com/docs/books/tutorial/native1.1/invoking/example-1dot1/invoke.c
|
||||
|
||||
#include <jni.h>
|
||||
|
||||
#ifdef _WIN32
|
||||
#define PATH_SEPARATOR ';'
|
||||
#else /* UNIX */
|
||||
#define PATH_SEPARATOR ':'
|
||||
#endif
|
||||
|
||||
// #define USER_CLASSPATH "." /* where Prog.class is */
|
||||
|
||||
extern void zsp_install(JNIEnv *env);
|
||||
|
||||
main() {
|
||||
JNIEnv *env;
|
||||
JavaVM *jvm;
|
||||
JDK1_1InitArgs vm_args;
|
||||
jint res;
|
||||
jclass cls;
|
||||
jmethodID mid;
|
||||
jstring jstr;
|
||||
jobjectArray args;
|
||||
char classpath[1024];
|
||||
|
||||
|
||||
/* IMPORTANT: specify vm_args version # if you use JDK1.1.2 and beyond */
|
||||
vm_args.version = 0x00010001;
|
||||
|
||||
JNI_GetDefaultJavaVMInitArgs(&vm_args);
|
||||
// Tjl
|
||||
vm_args.classpath = getenv("CLASSPATH");
|
||||
|
||||
// /* Append USER_CLASSPATH to the end of default system class path */
|
||||
// sprintf(classpath, "%s%c%s",
|
||||
// vm_args.classpath, PATH_SEPARATOR, USER_CLASSPATH);
|
||||
// vm_args.classpath = classpath;
|
||||
|
||||
/* Create the Java VM */
|
||||
res = JNI_CreateJavaVM(&jvm,&env,&vm_args);
|
||||
if (res < 0) {
|
||||
fprintf(stderr, "Can't create Java VM\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
zsp_install(env);
|
||||
|
||||
cls = (*env)->FindClass(env, "foo/Test1");
|
||||
if (cls == 0) {
|
||||
fprintf(stderr, "Can't find foo/Test1 class\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
mid = (*env)->GetStaticMethodID(env, cls, "main", "([Ljava/lang/String;)V");
|
||||
if (mid == 0) {
|
||||
fprintf(stderr, "Can't find Prog.main\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
jstr = (*env)->NewStringUTF(env, " from C!");
|
||||
if (jstr == 0) {
|
||||
fprintf(stderr, "Out of memory\n");
|
||||
exit(1);
|
||||
}
|
||||
args = (*env)->NewObjectArray(env, 1,
|
||||
(*env)->FindClass(env, "java/lang/String"), jstr);
|
||||
if (args == 0) {
|
||||
fprintf(stderr, "Out of memory\n");
|
||||
exit(1);
|
||||
}
|
||||
(*env)->CallStaticVoidMethod(env, cls, mid, args);
|
||||
|
||||
(*jvm)->DestroyJavaVM(jvm);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user