<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    <div class="moz-cite-prefix">On 23/04/14 12:31, Felipe Monteiro de
      Carvalho wrote:<br>
    </div>
    <blockquote
cite="mid:CACyNnZOgqDqf82P9tq+OFAOR7x8Pn4KBikj1rS389th9RsLdsA@mail.gmail.com"
      type="cite">
      <pre wrap="">On Wed, Apr 23, 2014 at 6:10 AM, leledumbo <a class="moz-txt-link-rfc2396E" href="mailto:leledumbo_cool@yahoo.co.id"><leledumbo_cool@yahoo.co.id></a> wrote:
</pre>
      <blockquote type="cite">
        <pre wrap="">Hmm...that's beyond my Java skill. Since Felipe who started the topic, you
can try PM him instead.
</pre>
      </blockquote>
      <pre wrap="">So looking at what he originally posted:

setOnCompletionListener(MediaPlayer.OnCompletionListener listener)

And looking into the documentation:

<a class="moz-txt-link-freetext" href="http://developer.android.com/reference/android/media/MediaPlayer.OnCompletionListener.html">http://developer.android.com/reference/android/media/MediaPlayer.OnCompletionListener.html</a>

you need to provide a class which implements the
MediaPlayer.OnCompletionListener interface:

There is nothing in JNI unfortunately which would allow us to create
new classes. JNI is very limited, unlike objc runtime which gives us
access to everything, JNI gives us a limited access to the Java world.

I already asked in the past in Java/Android groups about this, how to
get rid of Java when you need to pass a class which implements and
interface.

The answer is that it is possible: You need to create the class in
...... java bytecode =D And then pass it to Java.

At this point I gave up, considering it too awkward and wrote my
software part in Java and part in Pascal.

Ideally it would not be so hard if we had a bytecode generator which
accepts as input things like classname, which interfaces it will
implement, list of functions and address to their implementation, etc,
etc. But we don't have at the moment AFAIK.

So maybe someone braver will actually do this, since it is possible =D
But I didn't for my Android app in the app store (True Democracy)....</pre>
    </blockquote>
    <br>
    Now that I have re-read the (your) thread I had pointed out in my
    post, and went through a lot of googling, I think it is possible to
    create one static bit of java code (dynamic proxy) and instantiate
    that class from pascal/jni:<br>
    <br>
    The java code:<br>
    <br>
    <div>
      <div>public class NativeInvocationHandler implements
        InvocationHandler {</div>
      <div><span style="white-space:pre"> </span>public
        NativeInvocationHandler(long ptr) {</div>
      <div><span style="white-space:pre"> </span>this.ptr = ptr;</div>
      <div><span style="white-space:pre"> </span>}</div>
      <div><span style="white-space:pre"> </span></div>
      <div><span style="white-space:pre"> public static Object
          newInstance(Class clazz, long ptr) {<br>
          return java.lang.reflect.Proxy.newProxyInstance(<br>
        </span><span style="white-space:pre"><span
            style="white-space:pre">clazz</span>.getClassLoader(),<br>
        </span><span style="white-space:pre"><span
            style="white-space:pre">clazz</span>.getInterfaces(),<br>
          new </span><span style="white-space:pre">NativeInvocationHandler(</span><span
          style="white-space:pre"><span style="white-space:pre">ptr</span>));<br>
          }<br>
          <br>
        </span>Object invoke(Object proxy, Method method, Object[] args)
        {</div>
      <div><span style="white-space:pre"> </span>return invoke0(proxy,
        method, args);</div>
      <div><span style="white-space:pre"> </span>}</div>
      <div><span style="white-space:pre"> </span></div>
      <div><span style="white-space:pre"> </span>native private Object
        invoke0(Object proxy, Method method, Object[] args);</div>
      <div><span style="white-space:pre"> </span></div>
      <div><span style="white-space:pre"> </span>private long ptr;</div>
      <div>}<br>
        <br>
        Pascal:<br>
        function invoke0(env: PEnv; thiz: jobject; method: jmethod;
        args: jobjectArray): jobject;<br>
        var<br>
          ptrField: jFieldID;<br>
          jptr: jlong;<br>
          lMediaPlayerEvent: TMediaPlayerEvent<br>
        begin<br>
          ptrField := GetFieldID(GetObjectClass(thiz), 'ptr', 'J');<br>
          jptr := GetLongField(thiz, ptrField);<br>
          lMediaPlayerEvent := TMediaPlayerEvent(jptr);<br>
          result := lMediaPlayerEvent.invoke(env, method, args);<br>
        end;<br>
        <br>
        TMediaPlayerEvent = class(TObject)<br>
        public<br>
          function invoke(env: PEnv; method: jmethod; args:
        jobjectArray): jobject;<br>
        end;<br>
        <br>
        TMediaPlayerEvent.function invoke(env: PEnv; method: jmethod;
        args: jobjectArray): jobject;<br>
        begin<br>
          // code to handle events<br>
        end;<br>
        <br>
        Then:<br>
        - gMediaPlayerEvent := TMediaPlayerEvent.create;<br>
        - create the java media player<br>
        - call static method NativeInvocationHandler.<span
          style="white-space:pre">newInstance(javamediaplayerclass,
          gMediaPlayerEvent)<br>
          - set the java media player's setOnCompletionListener(result
          of </span><span style="white-space:pre">NativeInvocationHandler.<span
            style="white-space:pre">newInstance</span>)<br>
          <br>
          Now java media player events will be channelled to
          gMediaPlayerEvent.invoke<br>
          <br>
          The code above is untested and written hastily for the purpose
          of this email. I plan to test it today if I have enough time.<br>
          Comments/corrections are welcome.<br>
          <br>
          Stephano</span><br>
      </div>
    </div>
  </body>
</html>