summaryrefslogtreecommitdiff
path: root/portmidi/pm_java/pmjni
diff options
context:
space:
mode:
authorMitja Felicijan <mitja.felicijan@gmail.com>2024-10-07 06:50:04 +0200
committerMitja Felicijan <mitja.felicijan@gmail.com>2024-10-07 06:50:04 +0200
commit988f5d2b5343850e19ad1512cefe6c53953aa02e (patch)
tree1ff29934294e73b2575488c06df91866ce251dbe /portmidi/pm_java/pmjni
parent9b5839c58a2e1df8bddf6b98805998508ea417d5 (diff)
downloadttdaw-988f5d2b5343850e19ad1512cefe6c53953aa02e.tar.gz
Added bunch of examples
Diffstat (limited to 'portmidi/pm_java/pmjni')
-rw-r--r--portmidi/pm_java/pmjni/jportmidi_JportMidiApi.h293
-rw-r--r--portmidi/pm_java/pmjni/pmjni.c354
-rw-r--r--portmidi/pm_java/pmjni/pmjni.rc63
3 files changed, 710 insertions, 0 deletions
diff --git a/portmidi/pm_java/pmjni/jportmidi_JportMidiApi.h b/portmidi/pm_java/pmjni/jportmidi_JportMidiApi.h
new file mode 100644
index 0000000..2208be6
--- /dev/null
+++ b/portmidi/pm_java/pmjni/jportmidi_JportMidiApi.h
@@ -0,0 +1,293 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* Header for class jportmidi_JPortMidiApi */
+
+#ifndef _Included_jportmidi_JPortMidiApi
+#define _Included_jportmidi_JPortMidiApi
+#ifdef __cplusplus
+extern "C" {
+#endif
+#undef jportmidi_JPortMidiApi_PM_FILT_ACTIVE
+#define jportmidi_JPortMidiApi_PM_FILT_ACTIVE 16384L
+#undef jportmidi_JPortMidiApi_PM_FILT_SYSEX
+#define jportmidi_JPortMidiApi_PM_FILT_SYSEX 1L
+#undef jportmidi_JPortMidiApi_PM_FILT_CLOCK
+#define jportmidi_JPortMidiApi_PM_FILT_CLOCK 256L
+#undef jportmidi_JPortMidiApi_PM_FILT_PLAY
+#define jportmidi_JPortMidiApi_PM_FILT_PLAY 7168L
+#undef jportmidi_JPortMidiApi_PM_FILT_TICK
+#define jportmidi_JPortMidiApi_PM_FILT_TICK 512L
+#undef jportmidi_JPortMidiApi_PM_FILT_FD
+#define jportmidi_JPortMidiApi_PM_FILT_FD 8192L
+#undef jportmidi_JPortMidiApi_PM_FILT_UNDEFINED
+#define jportmidi_JPortMidiApi_PM_FILT_UNDEFINED 8192L
+#undef jportmidi_JPortMidiApi_PM_FILT_RESET
+#define jportmidi_JPortMidiApi_PM_FILT_RESET 32768L
+#undef jportmidi_JPortMidiApi_PM_FILT_REALTIME
+#define jportmidi_JPortMidiApi_PM_FILT_REALTIME 16641L
+#undef jportmidi_JPortMidiApi_PM_FILT_NOTE
+#define jportmidi_JPortMidiApi_PM_FILT_NOTE 50331648L
+#undef jportmidi_JPortMidiApi_PM_FILT_CHANNEL_AFTERTOUCH
+#define jportmidi_JPortMidiApi_PM_FILT_CHANNEL_AFTERTOUCH 536870912L
+#undef jportmidi_JPortMidiApi_PM_FILT_POLY_AFTERTOUCH
+#define jportmidi_JPortMidiApi_PM_FILT_POLY_AFTERTOUCH 67108864L
+#undef jportmidi_JPortMidiApi_PM_FILT_AFTERTOUCH
+#define jportmidi_JPortMidiApi_PM_FILT_AFTERTOUCH 603979776L
+#undef jportmidi_JPortMidiApi_PM_FILT_PROGRAM
+#define jportmidi_JPortMidiApi_PM_FILT_PROGRAM 268435456L
+#undef jportmidi_JPortMidiApi_PM_FILT_CONTROL
+#define jportmidi_JPortMidiApi_PM_FILT_CONTROL 134217728L
+#undef jportmidi_JPortMidiApi_PM_FILT_PITCHBEND
+#define jportmidi_JPortMidiApi_PM_FILT_PITCHBEND 1073741824L
+#undef jportmidi_JPortMidiApi_PM_FILT_MTC
+#define jportmidi_JPortMidiApi_PM_FILT_MTC 2L
+#undef jportmidi_JPortMidiApi_PM_FILT_SONG_POSITION
+#define jportmidi_JPortMidiApi_PM_FILT_SONG_POSITION 4L
+#undef jportmidi_JPortMidiApi_PM_FILT_SONG_SELECT
+#define jportmidi_JPortMidiApi_PM_FILT_SONG_SELECT 8L
+#undef jportmidi_JPortMidiApi_PM_FILT_TUNE
+#define jportmidi_JPortMidiApi_PM_FILT_TUNE 64L
+#undef jportmidi_JPortMidiApi_PM_FILT_SYSTEMCOMMON
+#define jportmidi_JPortMidiApi_PM_FILT_SYSTEMCOMMON 78L
+/*
+ * Class: jportmidi_JPortMidiApi
+ * Method: Pm_Initialize
+ * Signature: ()I
+ */
+JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1Initialize
+ (JNIEnv *, jclass);
+
+/*
+ * Class: jportmidi_JPortMidiApi
+ * Method: Pm_Terminate
+ * Signature: ()I
+ */
+JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1Terminate
+ (JNIEnv *, jclass);
+
+/*
+ * Class: jportmidi_JPortMidiApi
+ * Method: Pm_HasHostError
+ * Signature: (Ljportmidi/JPortMidiApi/PortMidiStream;)I
+ */
+JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1HasHostError
+ (JNIEnv *, jclass, jobject);
+
+/*
+ * Class: jportmidi_JPortMidiApi
+ * Method: Pm_GetErrorText
+ * Signature: (I)Ljava/lang/String;
+ */
+JNIEXPORT jstring JNICALL Java_jportmidi_JPortMidiApi_Pm_1GetErrorText
+ (JNIEnv *, jclass, jint);
+
+/*
+ * Class: jportmidi_JPortMidiApi
+ * Method: Pm_GetHostErrorText
+ * Signature: ()Ljava/lang/String;
+ */
+JNIEXPORT jstring JNICALL Java_jportmidi_JPortMidiApi_Pm_1GetHostErrorText
+ (JNIEnv *, jclass);
+
+/*
+ * Class: jportmidi_JPortMidiApi
+ * Method: Pm_CountDevices
+ * Signature: ()I
+ */
+JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1CountDevices
+ (JNIEnv *, jclass);
+
+/*
+ * Class: jportmidi_JPortMidiApi
+ * Method: Pm_GetDefaultInputDeviceID
+ * Signature: ()I
+ */
+JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1GetDefaultInputDeviceID
+ (JNIEnv *, jclass);
+
+/*
+ * Class: jportmidi_JPortMidiApi
+ * Method: Pm_GetDefaultOutputDeviceID
+ * Signature: ()I
+ */
+JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1GetDefaultOutputDeviceID
+ (JNIEnv *, jclass);
+
+/*
+ * Class: jportmidi_JPortMidiApi
+ * Method: Pm_GetDeviceInterf
+ * Signature: (I)Ljava/lang/String;
+ */
+JNIEXPORT jstring JNICALL Java_jportmidi_JPortMidiApi_Pm_1GetDeviceInterf
+ (JNIEnv *, jclass, jint);
+
+/*
+ * Class: jportmidi_JPortMidiApi
+ * Method: Pm_GetDeviceName
+ * Signature: (I)Ljava/lang/String;
+ */
+JNIEXPORT jstring JNICALL Java_jportmidi_JPortMidiApi_Pm_1GetDeviceName
+ (JNIEnv *, jclass, jint);
+
+/*
+ * Class: jportmidi_JPortMidiApi
+ * Method: Pm_GetDeviceInput
+ * Signature: (I)Z
+ */
+JNIEXPORT jboolean JNICALL Java_jportmidi_JPortMidiApi_Pm_1GetDeviceInput
+ (JNIEnv *, jclass, jint);
+
+/*
+ * Class: jportmidi_JPortMidiApi
+ * Method: Pm_GetDeviceOutput
+ * Signature: (I)Z
+ */
+JNIEXPORT jboolean JNICALL Java_jportmidi_JPortMidiApi_Pm_1GetDeviceOutput
+ (JNIEnv *, jclass, jint);
+
+/*
+ * Class: jportmidi_JPortMidiApi
+ * Method: Pm_OpenInput
+ * Signature: (Ljportmidi/JPortMidiApi/PortMidiStream;ILjava/lang/String;I)I
+ */
+JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1OpenInput
+ (JNIEnv *, jclass, jobject, jint, jstring, jint);
+
+/*
+ * Class: jportmidi_JPortMidiApi
+ * Method: Pm_OpenOutput
+ * Signature: (Ljportmidi/JPortMidiApi/PortMidiStream;ILjava/lang/String;II)I
+ */
+JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1OpenOutput
+ (JNIEnv *, jclass, jobject, jint, jstring, jint, jint);
+
+/*
+ * Class: jportmidi_JPortMidiApi
+ * Method: Pm_SetFilter
+ * Signature: (Ljportmidi/JPortMidiApi/PortMidiStream;I)I
+ */
+JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1SetFilter
+ (JNIEnv *, jclass, jobject, jint);
+
+/*
+ * Class: jportmidi_JPortMidiApi
+ * Method: Pm_SetChannelMask
+ * Signature: (Ljportmidi/JPortMidiApi/PortMidiStream;I)I
+ */
+JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1SetChannelMask
+ (JNIEnv *, jclass, jobject, jint);
+
+/*
+ * Class: jportmidi_JPortMidiApi
+ * Method: Pm_Abort
+ * Signature: (Ljportmidi/JPortMidiApi/PortMidiStream;)I
+ */
+JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1Abort
+ (JNIEnv *, jclass, jobject);
+
+/*
+ * Class: jportmidi_JPortMidiApi
+ * Method: Pm_Close
+ * Signature: (Ljportmidi/JPortMidiApi/PortMidiStream;)I
+ */
+JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1Close
+ (JNIEnv *, jclass, jobject);
+
+/*
+ * Class: jportmidi_JPortMidiApi
+ * Method: Pm_Read
+ * Signature: (Ljportmidi/JPortMidiApi/PortMidiStream;Ljportmidi/JPortMidiApi/PmEvent;)I
+ */
+JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1Read
+ (JNIEnv *, jclass, jobject, jobject);
+
+/*
+ * Class: jportmidi_JPortMidiApi
+ * Method: Pm_Poll
+ * Signature: (Ljportmidi/JPortMidiApi/PortMidiStream;)I
+ */
+JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1Poll
+ (JNIEnv *, jclass, jobject);
+
+/*
+ * Class: jportmidi_JPortMidiApi
+ * Method: Pm_Write
+ * Signature: (Ljportmidi/JPortMidiApi/PortMidiStream;Ljportmidi/JPortMidiApi/PmEvent;)I
+ */
+JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1Write
+ (JNIEnv *, jclass, jobject, jobject);
+
+/*
+ * Class: jportmidi_JPortMidiApi
+ * Method: Pm_WriteShort
+ * Signature: (Ljportmidi/JPortMidiApi/PortMidiStream;II)I
+ */
+JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1WriteShort
+ (JNIEnv *, jclass, jobject, jint, jint);
+
+/*
+ * Class: jportmidi_JPortMidiApi
+ * Method: Pm_WriteSysEx
+ * Signature: (Ljportmidi/JPortMidiApi/PortMidiStream;I[B)I
+ */
+JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1WriteSysEx
+ (JNIEnv *, jclass, jobject, jint, jbyteArray);
+
+/*
+ * Class: jportmidi_JPortMidiApi
+ * Method: Pt_TimeStart
+ * Signature: (I)I
+ */
+JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pt_1TimeStart
+ (JNIEnv *, jclass, jint);
+
+/*
+ * Class: jportmidi_JPortMidiApi
+ * Method: Pt_TimeStop
+ * Signature: ()I
+ */
+JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pt_1TimeStop
+ (JNIEnv *, jclass);
+
+/*
+ * Class: jportmidi_JPortMidiApi
+ * Method: Pt_Time
+ * Signature: ()I
+ */
+JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pt_1Time
+ (JNIEnv *, jclass);
+
+/*
+ * Class: jportmidi_JPortMidiApi
+ * Method: Pt_TimeStarted
+ * Signature: ()Z
+ */
+JNIEXPORT jboolean JNICALL Java_jportmidi_JPortMidiApi_Pt_1TimeStarted
+ (JNIEnv *, jclass);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+/* Header for class jportmidi_JPortMidiApi_PmEvent */
+
+#ifndef _Included_jportmidi_JPortMidiApi_PmEvent
+#define _Included_jportmidi_JPortMidiApi_PmEvent
+#ifdef __cplusplus
+extern "C" {
+#endif
+#ifdef __cplusplus
+}
+#endif
+#endif
+/* Header for class jportmidi_JPortMidiApi_PortMidiStream */
+
+#ifndef _Included_jportmidi_JPortMidiApi_PortMidiStream
+#define _Included_jportmidi_JPortMidiApi_PortMidiStream
+#ifdef __cplusplus
+extern "C" {
+#endif
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/portmidi/pm_java/pmjni/pmjni.c b/portmidi/pm_java/pmjni/pmjni.c
new file mode 100644
index 0000000..c60cffb
--- /dev/null
+++ b/portmidi/pm_java/pmjni/pmjni.c
@@ -0,0 +1,354 @@
+#include "portmidi.h"
+#include "porttime.h"
+#include "jportmidi_JportMidiApi.h"
+#include <stdio.h>
+
+// these macros assume JNIEnv *env is declared and valid:
+//
+#define CLASS(c, obj) jclass c = (*env)->GetObjectClass(env, obj)
+#define ADDRESS_FID(fid, c) \
+ jfieldID fid = (*env)->GetFieldID(env, c, "address", "J")
+// Uses Java Long (64-bit) to make sure there is room to store a
+// pointer. Cast this to a C long (either 32 or 64 bit) to match
+// the size of a pointer. Finally cast int to pointer. All this
+// is supposed to avoid C compiler warnings and (worse) losing
+// address bits.
+#define PMSTREAM(obj, fid) ((PmStream *) (intptr_t) (*env)->GetLongField(env, obj, fid))
+// Cast stream to long to convert integer to pointer, then expand
+// integer to 64-bit jlong. This avoids compiler warnings.
+#define SET_PMSTREAM(obj, fid, stream) \
+ (*env)->SetLongField(env, obj, fid, (jlong) (intptr_t) stream)
+
+
+/*
+ * Method: Pm_Initialize
+ */
+JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1Initialize
+ (JNIEnv *env, jclass cl)
+{
+ return Pm_Initialize();
+}
+
+
+/*
+ * Method: Pm_Terminate
+ */
+JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1Terminate
+ (JNIEnv *env, jclass cl)
+{
+ return Pm_Terminate();
+}
+
+
+/*
+ * Method: Pm_HasHostError
+ */
+JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1HasHostError
+ (JNIEnv *env, jclass cl, jobject jstream)
+{
+ CLASS(c, jstream);
+ ADDRESS_FID(fid, c);
+ return Pm_HasHostError(PMSTREAM(jstream, fid));
+}
+
+
+/*
+ * Method: Pm_GetErrorText
+ */
+JNIEXPORT jstring JNICALL Java_jportmidi_JPortMidiApi_Pm_1GetErrorText
+ (JNIEnv *env, jclass cl, jint i)
+{
+ return (*env)->NewStringUTF(env, Pm_GetErrorText(i));
+}
+
+
+/*
+ * Method: Pm_GetHostErrorText
+ */
+JNIEXPORT jstring JNICALL Java_jportmidi_JPortMidiApi_Pm_1GetHostErrorText
+ (JNIEnv *env, jclass cl)
+{
+ char msg[PM_HOST_ERROR_MSG_LEN];
+ Pm_GetHostErrorText(msg, PM_HOST_ERROR_MSG_LEN);
+ return (*env)->NewStringUTF(env, msg);
+}
+
+
+/*
+ * Method: Pm_CountDevices
+ */
+JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1CountDevices
+ (JNIEnv *env, jclass cl)
+{
+ return Pm_CountDevices();
+}
+
+
+/*
+ * Method: Pm_GetDefaultInputDeviceID
+ */
+JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1GetDefaultInputDeviceID
+ (JNIEnv *env, jclass cl)
+{
+ return Pm_GetDefaultInputDeviceID();
+}
+
+
+/*
+ * Method: Pm_GetDefaultOutputDeviceID
+ */
+JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1GetDefaultOutputDeviceID
+ (JNIEnv *env, jclass cl)
+{
+ return Pm_GetDefaultOutputDeviceID();
+}
+
+
+/*
+ * Method: Pm_GetDeviceInterf
+ */
+JNIEXPORT jstring JNICALL Java_jportmidi_JPortMidiApi_Pm_1GetDeviceInterf
+ (JNIEnv *env, jclass cl, jint i)
+{
+ const PmDeviceInfo *info = Pm_GetDeviceInfo(i);
+ if (!info) return NULL;
+ return (*env)->NewStringUTF(env, info->interf);
+}
+
+
+/*
+ * Method: Pm_GetDeviceName
+ */
+JNIEXPORT jstring JNICALL Java_jportmidi_JPortMidiApi_Pm_1GetDeviceName
+ (JNIEnv *env, jclass cl, jint i)
+{
+ const PmDeviceInfo *info = Pm_GetDeviceInfo(i);
+ if (!info) return NULL;
+ return (*env)->NewStringUTF(env, info->name);
+}
+
+
+/*
+ * Method: Pm_GetDeviceInput
+ */
+JNIEXPORT jboolean JNICALL Java_jportmidi_JPortMidiApi_Pm_1GetDeviceInput
+ (JNIEnv *env, jclass cl, jint i)
+{
+ const PmDeviceInfo *info = Pm_GetDeviceInfo(i);
+ if (!info) return (jboolean) 0;
+ return (jboolean) info->input;
+}
+
+
+/*
+ * Method: Pm_GetDeviceOutput
+ */
+JNIEXPORT jboolean JNICALL Java_jportmidi_JPortMidiApi_Pm_1GetDeviceOutput
+ (JNIEnv *env, jclass cl, jint i)
+{
+ const PmDeviceInfo *info = Pm_GetDeviceInfo(i);
+ if (!info) return (jboolean) 0;
+ return (jboolean) info->output;
+}
+
+
+/*
+ * Method: Pm_OpenInput
+ */
+JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1OpenInput
+ (JNIEnv *env, jclass cl,
+ jobject jstream, jint index, jstring extras, jint bufsiz)
+{
+ PmError rslt;
+ PortMidiStream *stream;
+ CLASS(c, jstream);
+ ADDRESS_FID(fid, c);
+ rslt = Pm_OpenInput(&stream, index, NULL, bufsiz, NULL, NULL);
+ SET_PMSTREAM(jstream, fid, stream);
+ return rslt;
+}
+
+
+/*
+ * Method: Pm_OpenOutput
+ */
+JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1OpenOutput
+ (JNIEnv *env, jclass cl, jobject jstream, jint index, jstring extras,
+ jint bufsiz, jint latency)
+{
+ PmError rslt;
+ PortMidiStream *stream;
+ CLASS(c, jstream);
+ ADDRESS_FID(fid, c);
+ rslt = Pm_OpenOutput(&stream, index, NULL, bufsiz, NULL, NULL, latency);
+ SET_PMSTREAM(jstream, fid, stream);
+ return rslt;
+}
+
+
+/*
+ * Method: Pm_SetFilter
+ */
+JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1SetFilter
+ (JNIEnv *env, jclass cl, jobject jstream, jint filters)
+{
+ CLASS(c, jstream);
+ ADDRESS_FID(fid, c);
+ return Pm_SetFilter(PMSTREAM(jstream, fid), filters);
+}
+
+
+/*
+ * Method: Pm_SetChannelMask
+ */
+JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1SetChannelMask
+ (JNIEnv *env, jclass cl, jobject jstream, jint mask)
+{
+ CLASS(c, jstream);
+ ADDRESS_FID(fid, c);
+ return Pm_SetChannelMask(PMSTREAM(jstream, fid), mask);
+}
+
+
+/*
+ * Method: Pm_Abort
+ */
+JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1Abort
+ (JNIEnv *env, jclass cl, jobject jstream)
+{
+ CLASS(c, jstream);
+ ADDRESS_FID(fid, c);
+ return Pm_Abort(PMSTREAM(jstream, fid));
+}
+
+
+/*
+ * Method: Pm_Close
+ */
+JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1Close
+ (JNIEnv *env, jclass cl, jobject jstream)
+{
+ CLASS(c, jstream);
+ ADDRESS_FID(fid, c);
+ return Pm_Close(PMSTREAM(jstream, fid));
+}
+
+
+/*
+ * Method: Pm_Read
+ */
+JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1Read
+ (JNIEnv *env, jclass cl, jobject jstream, jobject jpmevent)
+{
+ CLASS(jstream_class, jstream);
+ ADDRESS_FID(address_fid, jstream_class);
+ jclass jpmevent_class = (*env)->GetObjectClass(env, jpmevent);
+ jfieldID message_fid =
+ (*env)->GetFieldID(env, jpmevent_class, "message", "I");
+ jfieldID timestamp_fid =
+ (*env)->GetFieldID(env, jpmevent_class, "timestamp", "I");
+ PmEvent buffer;
+ PmError rslt = Pm_Read(PMSTREAM(jstream, address_fid), &buffer, 1);
+ (*env)->SetIntField(env, jpmevent, message_fid, buffer.message);
+ (*env)->SetIntField(env, jpmevent, timestamp_fid, buffer.timestamp);
+ return rslt;
+}
+
+
+/*
+ * Method: Pm_Poll
+ */
+JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1Poll
+ (JNIEnv *env, jclass cl, jobject jstream)
+{
+ CLASS(c, jstream);
+ ADDRESS_FID(fid, c);
+ return Pm_Poll(PMSTREAM(jstream, fid));
+}
+
+
+/*
+ * Method: Pm_Write
+ */
+JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1Write
+ (JNIEnv *env, jclass cl, jobject jstream, jobject jpmevent)
+{
+ CLASS(jstream_class, jstream);
+ ADDRESS_FID(address_fid, jstream_class);
+ jclass jpmevent_class = (*env)->GetObjectClass(env, jpmevent);
+ jfieldID message_fid =
+ (*env)->GetFieldID(env, jpmevent_class, "message", "I");
+ jfieldID timestamp_fid =
+ (*env)->GetFieldID(env, jpmevent_class, "timestamp", "I");
+ // note that we call WriteShort because it's simpler than constructing
+ // a buffer and passing it to Pm_Write
+ return Pm_WriteShort(PMSTREAM(jstream, address_fid),
+ (*env)->GetIntField(env, jpmevent, timestamp_fid),
+ (*env)->GetIntField(env, jpmevent, message_fid));
+}
+
+
+/*
+ * Method: Pm_WriteShort
+ */
+JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1WriteShort
+ (JNIEnv *env, jclass cl, jobject jstream, jint when, jint msg)
+{
+ CLASS(c, jstream);
+ ADDRESS_FID(fid, c);
+ return Pm_WriteShort(PMSTREAM(jstream, fid), when, msg);
+}
+
+
+/*
+ * Method: Pm_WriteSysEx
+ */
+JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1WriteSysEx
+ (JNIEnv *env, jclass cl, jobject jstream, jint when, jbyteArray jmsg)
+{
+ CLASS(c, jstream);
+ ADDRESS_FID(fid, c);
+ jbyte *bytes = (*env)->GetByteArrayElements(env, jmsg, 0);
+ PmError rslt = Pm_WriteSysEx(PMSTREAM(jstream, fid), when,
+ (unsigned char *) bytes);
+ (*env)->ReleaseByteArrayElements(env, jmsg, bytes, 0);
+ return rslt;
+}
+
+/*
+ * Method: Pt_TimeStart
+ */
+JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pt_1TimeStart
+ (JNIEnv *env, jclass c, jint resolution)
+{
+ return Pt_Start(resolution, NULL, NULL);
+}
+
+/*
+ * Method: Pt_TimeStop
+ */
+JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pt_1TimeStop
+ (JNIEnv *env, jclass c)
+ {
+ return Pt_Stop();
+ }
+
+/*
+ * Method: Pt_Time
+ */
+JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pt_1Time
+ (JNIEnv *env, jclass c)
+ {
+ return Pt_Time();
+ }
+
+/*
+ * Method: Pt_TimeStarted
+ */
+JNIEXPORT jboolean JNICALL Java_jportmidi_JPortMidiApi_Pt_1TimeStarted
+ (JNIEnv *env, jclass c)
+{
+ return Pt_Started();
+}
+
+
diff --git a/portmidi/pm_java/pmjni/pmjni.rc b/portmidi/pm_java/pmjni/pmjni.rc
new file mode 100644
index 0000000..1b7522b
--- /dev/null
+++ b/portmidi/pm_java/pmjni/pmjni.rc
@@ -0,0 +1,63 @@
+// Microsoft Visual C++ generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "afxres.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// English (U.S.) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+#ifdef _WIN32
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+#pragma code_page(1252)
+#endif //_WIN32
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE
+BEGIN
+ "resource.h\0"
+END
+
+2 TEXTINCLUDE
+BEGIN
+ "#include ""afxres.h""\r\n"
+ "\0"
+END
+
+3 TEXTINCLUDE
+BEGIN
+ "\r\n"
+ "\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
+#endif // English (U.S.) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
+