Hi All,

In the current JavaHL code the C++ objects are attached via pointer stored in
the long cppAddr field in java object.  The way C++ code gets hold of the
cppAddr value is to read this field using the GetLongField(). In summary

Java:

class JHLClass
{
  long cppAddr;
  public native method();
}


JNI Stub:

Java_method(JNIEnv *env, jobject jthis)
{
  JHLClass cppObj = JHLClass::getCppObject(jthis);
}

C++:

class JHLClass
{
  JHLClass getCppObject(jobject jthis) { .... }
}


I was thinking why not simplify this by doing all object->jlong lookup in the
java land. What takes about 20 lines of C++ takes 1 line in java, at a cost of
implementing 3 line java wrapper method that converts from caller visible
method signature to native method signature. As follows:

class JHLClass
{
  long cppAddr;

  private native static method(long cppAddr);
  method() {
    method(cppAddr);
  }
}

JNI Stub:

Java_method(JNIEnv *env, jlong cppAdder)
{
  JHLClass cppObj = reinterpret_cast<SVNFile *>(fileCppAddr);
}

C++: No additional code necessary

This will require a related change in JNIStackElement, as it won't have jthis
anymore. But this logic also can move up to java code in a similar manner.

What do others think? Any objections at least of doing this in RA functions?

Thank you for your time,

Vladimir

Reply via email to