📄 ch05.html
字号:
</DIV><DIV><H5 CLASS="B"><A NAME="pgfId-1087494"></A>Run the Example</H5><P CLASS="Body"><A NAME="pgfId-1087495"></A>To run the example, the Java virtual machine needs to find the native JNI library that was created. To do this, set the library path to the current directory as follows: </P><DIV><H6 CLASS="D"><A NAME="pgfId-1087496"></A><EM CLASS="D-Code">Unix or Linux:</EM></H6><PRE CLASS="CODE"><A NAME="pgfId-1087497"></A>LD_LIBRARY_PATH=.</PRE><PRE CLASS="CODE"><A NAME="pgfId-1087498"></A>export LD_LIBRARY_PATH</PRE></DIV><DIV><H6 CLASS="D"><A NAME="pgfId-1087499"></A><EM CLASS="D-Code">Windows NT/2000/95:</EM></H6><PRE CLASS="CODE"><A NAME="pgfId-1087500"></A>set PATH=%path%;.</PRE><P CLASS="Body"><A NAME="pgfId-1087501"></A>With the library path properly specified for your platform, invoke the program as you normally would with the interpreter command: </P><PRE CLASS="CODE"><A NAME="pgfId-1087502"></A>java ReadFile</PRE></DIV></DIV></DIV><DIV><H4 CLASS="A"><A NAME="pgfId-1087504"></A><A NAME="22670"></A>Strings and Arrays</H4><P CLASS="Body"><A NAME="pgfId-1087505"></A>This section explains how to pass string and array data between a program written in the Java programming language and a program written in another language.</P><DIV><H5 CLASS="B"><A NAME="pgfId-1087506"></A>Passing Strings</H5><P CLASS="Body"><A NAME="pgfId-1087509"></A>The <EM CLASS="CODE">String</EM> object in the Java programming language, which is represented as <EM CLASS="CODE">jstring</EM><A NAME="marker-1087507"></A><A NAME="marker-1087508"></A> in JNI, is a 16-bit unicode string. In C a string is by default constructed from 8-bit characters. So, to access a Java String object passed to a C or C++ function or return a C or C++ string to a Java method, you need to use JNI conversion functions in your native method implementation. </P><P CLASS="Body"><A NAME="pgfId-1087511"></A>The <EM CLASS="CODE">GetStringUTFChar</EM><A NAME="marker-1087510"></A> function retrieves 8-bit characters from a 16-bit <EM CLASS="CODE">jstring</EM> using the <A NAME="marker-1087512"></A>Unicode Transformation Format (UTF). UTF represents Unicode as a string of 8- or 16-bit characters without losing any information. The third parameter <EM CLASS="CODE">GetStringUTFChar</EM> returns the result <EM CLASS="CODE">JNI_TRUE</EM><A NAME="marker-1087513"></A> if it made a local copy of the <EM CLASS="CODE">jstring,</EM> or it returns <EM CLASS="CODE">JNI_FALSE</EM><A NAME="marker-1087514"></A> otherwise. </P><DIV><H6 CLASS="D"><A NAME="pgfId-1087515"></A><EM CLASS="D-Code">C Version:</EM></H6><PRE CLASS="CODE"><A NAME="pgfId-1087516"></A>(*env)->GetStringUTFChars(env, name, iscopy)</PRE></DIV><DIV><H6 CLASS="D"><A NAME="pgfId-1087517"></A><EM CLASS="D-Code">C++ Version:</EM></H6><PRE CLASS="CODE"><A NAME="pgfId-1087518"></A>env->GetStringUTFChars(name, iscopy)</PRE><P CLASS="Body"><A NAME="pgfId-1087519"></A>The following C JNI function converts an array of C characters to a <EM CLASS="CODE">jstring</EM>: </P><PRE CLASS="CODE-caption"><A NAME="pgfId-1087521"></A>//API Ref: <A NAME="36311"></A>jstring NewStringUTF(JNIEnv *env, const char *bytes)</PRE><PRE CLASS="CODE"><A NAME="pgfId-1087524"></A><A NAME="marker-1087522"></A><A NAME="NewStringUTF function"></A>(*env)->NewStringUTF(env, lastfile)</PRE><P CLASS="Body"><A NAME="pgfId-1087525"></A>The example below converts the <EM CLASS="CODE">lastfile[80]</EM> C character array to a <EM CLASS="CODE">jstring</EM>, which is returned to the calling Java method: </P><PRE CLASS="CODE"><A NAME="pgfId-1087526"></A>static char lastfile[80];JNIEXPORT jstring JNICALL Java_ReadFile_lastFile (JNIEnv *env, jobject jobj) {</PRE><PRE CLASS="CODE-caption"><A NAME="pgfId-1087528"></A>//API Ref: <A NAME="52421"></A>jstring NewStringUTF(JNIEnv *env, const char *bytes)</PRE><PRE CLASS="CODE"><A NAME="pgfId-1087530"></A> <A NAME="marker-1087529"></A>return((*env)->NewStringUTF(env, lastfile));}</PRE><P CLASS="Body"><A NAME="pgfId-1087531"></A>To let the Java virtual machine know you are finished with the UTF representation, call the <EM CLASS="CODE">ReleaseStringUTFChars</EM><A NAME="marker-1087532"></A> conversion function as shown below. The second argument is the original <EM CLASS="CODE">jstring</EM> value used to construct the UTF representation, and the third argument is the reference to the local representation of that <EM CLASS="CODE">String</EM>. </P><PRE CLASS="CODE"><A NAME="pgfId-1087533"></A>(*env)->ReleaseStringUTFChars(env, name, mfile);</PRE><P CLASS="Body"><A NAME="pgfId-1087534"></A>If your native code can work with Unicode without needing the intermediate UTF representation, call the <EM CLASS="CODE">GetStringChars</EM><A NAME="marker-1087535"></A> function to retrieve the Unicode string, and release the reference with a call to <EM CLASS="CODE">ReleaseStringChars</EM>: </P><PRE CLASS="CODE"><A NAME="pgfId-1087536"></A>JNIEXPORT jbyteArray JNICALL Java_ReadFile_loadFile (JNIEnv * env, jobject jobj, jstring name) { caddr_t m; jbyteArray jb; struct stat finfo; jboolean iscopy;</PRE><PRE CLASS="CODE-caption"><A NAME="pgfId-1087538"></A>//API Ref: <A NAME="59207"></A>const jchar *GetStringChars(JNIEnv *env, jstring string, jboolean *iscopy)</PRE><PRE CLASS="CODE"><A NAME="pgfId-1087541"></A> <A NAME="marker-1087539"></A><A NAME="GetStringChars function"></A>const jchar *mfile = (*env)->GetStringChars(env, name, &iscopy); //...</PRE><PRE CLASS="CODE-caption"><A NAME="pgfId-1087543"></A>//API Ref: <A NAME="40841"></A>void ReleaseStringChars(JNIEnv *env, jstring string, const jchar *chars)</PRE><PRE CLASS="CODE"><A NAME="pgfId-1087546"></A> <A NAME="marker-1087544"></A><A NAME="ReleaseStringChars function"></A>(*env)->ReleaseStringChars(env, name, mfile);</PRE></DIV></DIV><DIV><H5 CLASS="B"><A NAME="pgfId-1087547"></A>Passing Arrays</H5><P CLASS="Body"><A NAME="pgfId-1087550"></A><A NAME="marker-1087548"></A><A NAME="marker-1087549"></A>In the example presented in the last section, the <EM CLASS="CODE">loadFile</EM> native method returns the contents of a file in a byte array, which is a primitive type in the Java programming language. You can retrieve and create primitive types in the Java programming language by calling the appropriate <EM CLASS="CODE">TypeArray</EM><A NAME="marker-1087551"></A> function. </P><P CLASS="Body"><A NAME="pgfId-1087553"></A>For example, to create a new array of floats, call <EM CLASS="CODE">NewFloatArray</EM><A NAME="marker-1087552"></A>, or to create a new array of bytes, call <EM CLASS="CODE">NewByteArray</EM><A NAME="marker-1087554"></A>. This naming scheme extends to retrieving elements from, adding elements to, and changing elements in the array. To get elements from an array of bytes, call <EM CLASS="CODE">GetByteArrayElements</EM><A NAME="marker-1087555"></A>. To add elements to or change elements in the array, call <EM CLASS="CODE">Set<type>ArrayElements</EM><A NAME="marker-1087556"></A>. </P><P CLASS="Body"><A NAME="pgfId-1087557"></A>The <EM CLASS="CODE">GetByteArrayElements</EM> function affects the entire array. To work on a portion of the array, call <EM CLASS="CODE">GetByteArrayRegion</EM><A NAME="marker-1087558"></A> instead. There is only a <EM CLASS="CODE">Set<type>ArrayRegion</EM><A NAME="marker-1087559"></A> function for changing array elements. However the region could be of size <EM CLASS="CODE">array.length</EM>, which is equivalent to the nonexistent <EM CLASS="CODE">Set<type>ArrayElements</EM>.<A NAME="marker-1087560"></A> </P><TABLE><TR><TH ROWSPAN="1" COLSPAN="1"><P CLASS="TCH"><A NAME="pgfId-1087563"></A><EM CLASS="Bold">Native Code Type</EM></P></TH><TH ROWSPAN="1" COLSPAN="1"><P CLASS="TCH"><A NAME="pgfId-1087565"></A><EM CLASS="Bold">Functions Used</EM></P></TH></TR><TR><TD ROWSPAN="1" COLSPAN="1"><P CLASS="TB1"><A NAME="pgfId-1087568"></A><EM CLASS="CODE">jboolean</EM><A NAME="marker-1087567"></A></P></TD><TD ROWSPAN="1" COLSPAN="1"><P CLASS="TB1"><A NAME="pgfId-1087570"></A><EM CLASS="CODE">NewBooleanArray</EM></P><P CLASS="TB"><A NAME="pgfId-1087571"></A><EM CLASS="CODE">GetBooleanArrayElements </EM></P><P CLASS="TB"><A NAME="pgfId-1087572"></A><EM CLASS="CODE">GetBooleanArrayRegion/SetBooleanArrayRegion</EM></P><P CLASS="TB"><A NAME="pgfId-1087573"></A><EM CLASS="CODE">ReleaseBooleanArrayRegion </EM></P></TD></TR><TR><TD ROWSPAN="1" COLSPAN="1"><P CLASS="TB"><A NAME="pgfId-1087576"></A><EM CLASS="CODE">jbyte</EM><A NAME="marker-1087575"></A></P></TD><TD ROWSPAN="1" COLSPAN="1"><P CLASS="TB"><A NAME="pgfId-1087578"></A><EM CLASS="CODE">NewByteArray </EM></P><P CLASS="TB"><A NAME="pgfId-1087579"></A><EM CLASS="CODE">GetByteArrayElements</EM></P><P CLASS="TB"><A NAME="pgfId-1087580"></A><EM CLASS="CODE">GetByteArrayRegion/SetByteArrayRegion</EM></P><P CLASS="TB"><A NAME="pgfId-1087581"></A><EM CLASS="CODE">ReleaseByteArrayRegion </EM></P></TD></TR><TR><TD ROWSPAN="1" COLSPAN="1"><P CLASS="TB"><A NAME="pgfId-1087584"></A><EM CLASS="CODE">jchar</EM><A NAME="marker-1087583"></A></P></TD><TD ROWSPAN="1" COLSPAN="1"><P CLASS="TB"><A NAME="pgfId-1087586"></A><EM CLASS="CODE">NewCharArray </EM></P><P CLASS="TB"><A NAME="pgfId-1087587"></A><EM CLASS="CODE">GetCharArrayElements</EM></P><P CLASS="TB"><A NAME="pgfId-1087588"></A><EM CLASS="CODE">GetCharArrayRegion/SetCharArrayRegion</EM></P><P CLASS="TB"><A NAME="pgfId-1087589"></A><EM CLASS="CODE">ReleaseCharArrayRegion </EM></P></TD></TR><TR><TD ROWSPAN="1" COLSPAN="1"><P CLASS="TB"><A NAME="pgfId-1087592"></A><EM CLASS="CODE">jdouble</EM><A NAME="marker-1087591"></A></P></TD><TD ROWSPAN="1" COLSPAN="1"><P CLASS="TB"><A NAME="pgfId-1087594"></A><EM CLASS="CODE">NewDoubleArray </EM></P><P CLASS="TB"><A NAME="pgfId-1087595"></A><EM CLASS="CODE">GetDoubleArrayElements</EM></P><P CLASS="TB"><A NAME="pgfId-1087596"></A><EM CLASS="CODE">GetDoubleArrayRegion/SetDoubleArrayRegion</EM></P><P CLASS="TB"><A NAME="pgfId-1087597"></A><EM CLASS="CODE">ReleaseDoubleArrayRegion </EM></P></TD></TR><TR><TD ROWSPAN="1" COLSPAN="1"><P CLASS="TB"><A NAME="pgfId-1087600"></A><EM CLASS="CODE">jfloat</EM><A NAME="marker-1087599"></A></P></TD><TD ROWSPAN="1" COLSPAN="1"><P CLASS="TB"><A NAME="pgfId-1087602"></A><EM CLASS="CODE">NewFloatArray </EM></P><P CLASS="TB"><A NAME="pgfId-1087603"></A><EM CLASS="CODE">GetFloatArrayElements</EM>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -