⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jniref.html

📁 jdbc书
💻 HTML
📖 第 1 页 / 共 3 页
字号:

<PRE>
  static jobject stringarray=0;

  JNIEXPORT void JNICALL Java_ArrayHandler_returnArray
  (JNIEnv *env, jobject jobj){

    jobjectArray ret;
    int i;
    jint arraysize;
    int asize;
    jclass cls, tmpcls;
    jmethodID mid;
    jfieldID fid;

    char *message[5]= {"first", 
		"second", 
		"third", 
		"fourth", 
		"fifth"};

    ret=(jobjectArray)env-&gt;NewObjectArray(5,
        env-&gt;FindClass("java/lang/String"),
        env-&gt;NewStringUTF(""));

  //Make the array available globally
    stringarray=env-&gt;NewGlobalRef(ret);

  //Process array
  // ...

  //clear local reference when finished..
    env-&gt;DeleteLocalRef(ret);
  }
</PRE>

<A NAME="invoke"></A>
<H3>Invocation</H3>

The section on  calling methods showed you how to call a method
or field in a Java language program using the 
JNI interface and a class loaded using the <CODE>FindClass</CODE> function. 
With a little more code, you can create a standalone
program that invokes a Java virtual machine and includes its own JNI interface pointer
that can be used to create instances of Java language classes. In the Java 2
release, the runtime program named <CODE>java</CODE> is a small JNI 
application that does exactly that.

<P>
You can create a Java virtual machine with a call to <CODE>JNI_CreateJavaVM</CODE>,
and shut the created Java virtual machine down with a call to 
<CODE>JNI_DestroyJavaVM</CODE>. 
A Java vitual machine might also need some additional environment properties. 
These properties can be passed to the <CODE>JNI_CreateJavaVM</CODE> function 
in a <CODE>JavaVMInitArgs</CODE> structure. 

<P>
The <CODE>JavaVMInitArgs</CODE> structure contains a pointer to a
<CODE>JavaVMOption</CODE> value used to store environment information 
such as the classpath and Java virtual machine version, or system properties that would 
normally be passed on the command line to the program.

<P>
When the <CODE>JNI_CreateJavaVM</CODE> function returns, you can
call methods and create instances of classes using the <CODE>FindClass</CODE>
and <CODE>NewObject</CODE> functions the same way you would
for embedded native code.

<P>
<BLOCKQUOTE>
<HR>
<STRONG>Note:</STRONG> The Java virtual machine invocation used to be only used 
for native thread Java virtual machines. Some older Java 
virtual machines have a green threads 
option that is stable for invocation use. On a Unix platform, you 
may also need to explicitly link with <CODE>-lthread</CODE> 
or <CODE>-lpthread</CODE>. 
<HR>
</BLOCKQUOTE>

This next program invokes a Java virtual machine, loads the <CODE>ArrayHandler</CODE> 
class, and retrieves the <CODE>arraySize</CODE> field which should contain
the value minus one. The Java virtual machine options include the current path 
in the classpath and turning the Just-In-Time (JIT) compiler off
<CODE>-Djava.compiler=NONE</CODE>.

<PRE>
&#35;include &lt;jni.h&gt;

void main(int argc, char *argv[], char **envp) {
  JavaVMOption options[2];
  JavaVMInitArgs vm_args;
  JavaVM *jvm;
  JNIEnv *env;
  long result;
  jmethodID mid;
  jfieldID fid;
  jobject jobj;
  jclass cls;
  int i, asize;

  options[0].optionString = ".";
  options[1].optionString = "-Djava.compiler=NONE";

  vm_args.version = JNI_VERSION_1_2;
  vm_args.options = options;
  vm_args.nOptions = 2;
  vm_args.ignoreUnrecognized = JNI_FALSE;

  result = JNI_CreateJavaVM(
             &amp;jvm,(void **)&amp;env, &amp;vm_args);
  if(result == JNI_ERR ) {
    printf("Error invoking the JVM");
    exit (-1);
  }

  cls = (*env)-&gt;FindClass(env,"ArrayHandler");
  if( cls == NULL ) {
    printf("can't find class ArrayHandler\n");
    exit (-1);
  }
  (*env)-&gt;ExceptionClear(env);
  mid=(*env)-&gt;GetMethodID(env, cls, "&lt;init&gt;", "()V");
  jobj=(*env)-&gt;NewObject(env, cls, mid);
  fid=(*env)-&gt;GetFieldID(env, cls, "arraySize", "I");
  asize=(*env)-&gt;GetIntField(env, jobj, fid);

  printf("size of array is %d",asize);
  (*jvm)-&gt;DestroyJavaVM(jvm);
}
</PRE>

<A NAME="attach"></A>
<H3>Attaching Threads</H3>

After the Java virtual machine is invoked, there is one local thread running 
the Java virtual machine. You can create more threads in the local operating 
system and attach the Java virtual machine to those new threads. You might 
want to do this if your native application is multi-threaded.

<P>
Attach the local thread to the Java virtual machine with a call to
<CODE>AttachCurrentThread</CODE>. You need to supply pointers to
the Java virtual machine instance and JNI environment. In the Java 2 
platform, you can also specify in the third parameter the thread name
and/or group you want this new thread to live under. It is important
to detach any thread that has been previously attached; otherwise, the 
program will not exit when you call <CODE>DestroyJavaVM</CODE>.

<PRE>
&#35;include &lt;jni.h&gt;
&#35;include &lt;pthread.h&gt;

JavaVM *jvm;

void *native_thread(void *arg) {
  JNIEnv *env;
  jclass cls;
  jmethodID mid;
  jfieldID fid;
  jint result;
  jobject jobj;
  JavaVMAttachArgs args;
  jint asize;
  
  args.version= JNI_VERSION_1_2;
  args.name="user";
  args.group=NULL;
  result=(*jvm)-&gt;AttachCurrentThread(
	jvm, (void **)&amp;env, &amp;args);

  cls = (*env)-&gt;FindClass(env,"ArrayHandler");
  if( cls == NULL ) {
    printf("can't find class ArrayHandler\n");
    exit (-1);
  }
  (*env)-&gt;ExceptionClear(env);
  mid=(*env)-&gt;GetMethodID(env, cls, "&lt;init&gt;", "()V");
  jobj=(*env)-&gt;NewObject(env, cls, mid);
  fid=(*env)-&gt;GetFieldID(env, cls, "arraySize", "I");
  asize=(*env)-&gt;GetIntField(env, jobj, fid);
  printf("size of array is %d\n",asize);
  (*jvm)-&gt;DetachCurrentThread(jvm);
}

void main(int argc, char *argv[], char **envp) {
  JavaVMOption *options;
  JavaVMInitArgs vm_args;
  JNIEnv *env;
  jint result;
  pthread_t tid;
  int thr_id;
  int i;

  options = (void *)malloc(3 * sizeof(JavaVMOption));

  options[0].optionString = "-Djava.class.path=.";
  options[1].optionString = "-Djava.compiler=NONE";

  vm_args.version = JNI_VERSION_1_2;
  vm_args.options = options;
  vm_args.nOptions = 2;
  vm_args.ignoreUnrecognized = JNI_FALSE;

  result = JNI_CreateJavaVM(&amp;jvm,(void **)&amp;env, &amp;vm_args);
  if(result == JNI_ERR ) {
    printf("Error invoking the JVM");
    exit (-1);
  }

  thr_id=pthread_create(&amp;tid, NULL, native_thread, NULL);

// If you don't have join, sleep instead
//sleep(1000);
  pthread_join(tid, NULL);
  (*jvm)-&gt;DestroyJavaVM(jvm);
  exit(0);
}
</PRE>

<P>
_______<BR>
<A NAME="TJVM"><SUP>1</SUP></A> As used on this web site, 
the terms &quot;Java virtual 
machine&quot; or &quot;JVM&quot; mean a virtual machine 
for the Java platform.

<P ALIGN="RIGHT">
<FONT SIZE="-1">[<A HREF="#top">TOP</A>]</FONT>

</FONT>
</TD>
</TR>
</TABLE>




<!-- ================ -->
<!-- End Main Content -->
<!-- ================ -->

</TD>
</TR>
</TABLE>

<!-- Copyright Insert -->

<BR CLEAR="ALL">

<FORM ACTION="/cgi-bin/search.cgi" METHOD="POST">
<TABLE WIDTH="100%" CELLPADDING="0" BORDER="0" CELLSPACING="5">   
  <TR>
    <TD VALIGN="TOP">
	
    <P ALIGN=CENTER>
    <FONT SIZE="-1" COLOR="#999999" FACE="Verdana, Arial, Helvetica, sans-serif">
    [ This page was updated: <!-- new date --> 13-Oct-99 ]</font></P>
    </TD>
  </TR>
  
  <TR>
    <TD BGCOLOR="#CCCCCC">
    <IMG SRC="/images/pixel.gif" HEIGHT="1" WIDTH="1" ALT=""></TD>
  </TR>
  
  <TR>
    <TD>
    <CENTER>
    <FONT SIZE="-2" FACE="Verdana, Arial, Helvetica, sans-serif">
    <A HREF="http://java.sun.com/products/">Products &amp; APIs</A> | 
    <A HREF="/developer/index.html">Developer Connection</A> | 
    <A HREF="/developer/infodocs/index.shtml">Docs &amp; Training</A> | 
    <A HREF="/developer/support/index.html">Online Support</A><BR>
    <A HREF="/developer/community/index.html">Community Discussion</A> |
    <A HREF="http://java.sun.com/industry/">Industry News</A> | 
    <A HREF="http://java.sun.com/solutions">Solutions Marketplace</A> | 
    <A HREF="http://java.sun.com/casestudies">Case Studies</A>
    </FONT>
    </CENTER>
    </TD>
  </TR>
  
  <TR>
    <TD BGCOLOR="#CCCCCC">
    <IMG SRC="/images/pixel.gif" HEIGHT="1" WIDTH="1" ALT=""></TD>
  </TR>

  <TR>
    <TD ALIGN="CENTER">
    <FONT SIZE="-2" FACE="Verdana, Arial, Helvetica, sans-serif">
    <A HREF="http://java.sun.com/docs/glossary.html">Glossary</A> - 
    <A HREF="http://java.sun.com/applets/">Applets</A> - 
    <A HREF="http://java.sun.com/docs/books/tutorial/">Tutorial</A> - 
    <A HREF="http://java.sun.com/jobs/">Employment</A> - 
    <A HREF="http://java.sun.com/nav/business/">Business &amp; Licensing</A> - 
    <A HREF="http://java.sun.com/javastore/">Java Store</A> -
    <A HREF="http://java.sun.com/casestudies/">Java in the Real World</A>
    </FONT>
    </TD>
  </TR>

  <TR>
    <TD>
    <CENTER>
    <FONT SIZE="-2" FACE="Verdana, Arial, Helvetica, sans-serif">
    <a href="/siteinfo/faq.html">FAQ</a> |
    <a href="/feedback/index.html">Feedback</a> | 
    <a href="http://www.dynamicdiagrams.net/mapa/cgi-bin/help.tcl?db=javasoft&dest=http://java.sun.com/">Map</a> | 
    <A HREF="http://java.sun.com/a-z/index.html">A-Z Index</A>
    </FONT>
    </CENTER>

    </TD>
  </TR>
  
  <TR>
    <TD>

    <TABLE WIDTH="100%" CELLPADDING="0" BORDER="0" CELLSPACING="0">
      <TR>
        <TD WIDTH="50%">
        <FONT SIZE="-2" FACE="Verdana, Arial, Helvetica, sans-serif">
        For more information on Java technology<BR>
        and other software from Sun Microsystems, call:<BR>
        </FONT>
        <FONT SIZE="-1" FACE="Verdana, Arial, Helvetica, sans-serif">
        (800) 786-7638<BR></FONT>
        <FONT SIZE="-2" FACE="Verdana, Arial, Helvetica, sans-serif">
        Outside the U.S. and Canada, dial your country's 
        <A HREF="http://www.att.com/business_traveler/attdirecttollfree/">AT&amp;T&nbsp;Direct&nbsp;Access&nbsp;Number</A> first.<BR>
        </FONT>
        </TD>

        <TD ALIGN="RIGHT" WIDTH="50%">
        <A HREF="http://www.sun.com"><IMG SRC="/images/lgsun.gif" width="64" height="30" border="0" ALT="Sun Microsystems, Inc."></A><BR>
        <FONT SIZE="-2" FACE="Verdana, Arial, Helvetica, sans-serif">
        Copyright &copy; 1995-99
        <A HREF="http://www.sun.com">Sun Microsystems, Inc.</A><BR>
        All Rights Reserved. 
        <a href="http://www.sun.com/share/text/SMICopyright.html">Legal Terms</a>. 
        <A HREF="http://www.sun.com/privacy/">Privacy&nbsp;Policy</A>.
        </FONT>
        </TD>
      </TR>
    </TABLE>
	
    </TD>
  </TR> 
</TABLE>
</FORM>

<!-- End Copyright Insert -->


</BODY>
</HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -