Step 2: Implement the creator class
Like
any nonvisual native class, the CJavaVM class must implement the Invoke and Destroy functions
in addition to the class functions CreateJavaObject and CreateJavaVM.
The CreateJavaVm function of CjavaVM gets
the classpath and properties from the PBCallInfo structure. Then
it loads the Java VM by calling the loadJavaVM function
of a wrapper class called JavaVMWrapper. The JavaVMWrapper class
encapsulates the JavaVM interface provided by JNI.
The CreateJavaObject function creates an
instance of a Java class based on the given class name, creates
a PowerBuilder proxy object for the Java object, creates a JavaMarshaler
object, and associates the marshaler object with the proxy object.
The following is the CreateJavaObject function:
|
1 |
PBXRESULT CJavaVM::CreateJavaObject<br>  (<br>  IPB_Session  *session, <br>  pbobject     obj, <br>  PBCallInfo   *ci<br>  )<br>{<br>  enum<br>  {<br>    kSuccessful = 0,<br>    kInvalidJavaClassName = -1,<br>    kFailedToCreateJavaClass = -2,<br>    kInvalidProxyName = -3,<br>    kFailToCreateProxy = -4<br>  };<br> <br>  // Get java class name.<br>  string jclassName;<br> <br>  {<br>    pbstring jcn = ci->pArgs->GetAt(1)->GetPBString();<br>    if (jcn == NULL)<br>    {<br>      ci->returnValue->SetLong(kInvalidJavaClassName);<br>      return PBX_OK;<br>    } |
|
1 |
     |
|
1 |
    else<br>    {<br>      jclassName = session->GetString(jcn);<br>    }<br>  }<br> <br>  // Create java object<br>  JavaVMWrapper*  jvm = JavaVMWrapper::instance();<br>  JNIEnv*         env = jvm->getEnv();<br> <br>  jclass jcls = env->FindClass(jclassName.c_str());<br>  jobject jobj = NULL;<br> <br>  if (jcls != NULL)<br>  {<br>    JLocalRef  lrClz(env, jcls);<br> <br>    jmethodID mid = env->GetMethodID(jcls, "<init>",<br>      "()V");<br>    if (mid != NULL)<br>    {<br>      jobj = env->NewObject(jcls, mid);<br>    }<br>  }<br> <br>  // Get PowerBuilder proxy name<br>  string proxyName;<br> <br>  {<br>    pbstring pn = ci->pArgs->GetAt(2)->GetPBString();<br> <br>    if (pn == NULL)<br>    {<br>      ci->returnValue->SetLong(kInvalidProxyName);<br>      return PBX_OK;<br>    }<br>    else<br>    {<br>      proxyName = session->GetString(pn);<br>    }<br>  } |
|
1 |
<br>  // Find proxy class<br>  pbgroup group = session->FindGroup(proxyName.c_str(),<br>    pbgroup_proxy);<br>  if (group == NULL)<br>  {<br>    ci->returnValue->SetLong(kInvalidProxyName);<br>    return PBX_OK;<br>  }<br> <br>  pbclass cls = session->FindClass(group, proxyName.c_str());<br>  if (cls == NULL)<br>  {<br>    ci->returnValue->SetLong(kInvalidProxyName);<br>    return PBX_OK;<br>  }<br> <br>  // Create PowerBuilder proxy object.<br>  pbproxyObject proxy = session->NewProxyObject(cls);<br>  if (proxy == NULL)<br>  {<br>    ci->returnValue->SetLong(kFailToCreateProxy);<br>    return PBX_OK;<br>  }<br> <br>  // Create JavaMarshaler<br>  JavaMarshaler* marshaler = new JavaMarshaler(env,<br>    proxy, jobj);<br> <br>  // Associate the JavaMarshaler with the proxy<br>  session->SetMarshaler(proxy, marshaler);<br>  <br>  ci->pArgs->GetAt(0)->SetObject(proxy);<br> <br>  ci->returnValue->SetLong(kSuccessful);<br>  <br>  return PBX_OK;<br>} |
Document get from Powerbuilder help
Thank you for watching.
Subscribe
Login
0 Comments
Oldest