JNI Index
Some JNI String Functions
To convert a jstring to a C-style string, you might write code like the following:
1 2 3 4 5 6 7 8 9 | JNIEXPORT void JNICALLJava_MyJavaClass_printName(JNIEnv *env, jobject obj, jstring name) { const char *str= (*env)->GetStringUTFChars(env,name,0); printf(“%s”, str); //need to release this string when done with it in //order to avoid memory leak (*env)->ReleaseStringUTFChars(env, name, str); } |
To convert a C-style string to a jstring , you can use the (*env)->NewStringUTF() function to create a new jstring from a C-style string. For example, a C function that needs to return a Java string could contain the following code:
1 2 3 4 | JNIEXPORT jstring JNICALLJava_MyJavaClass_getName(JNIEnv *env, jobject obj) { return (*env)->NewStringUTF(env, “My String”); } |
JNI String functions:
| JNI Function | Description |
| GetStringChars ReleaseStringChars |
Obtains or releases a pointer to the contents of a string in Unicode format. May return a copy of the string. |
| GetStringUTFChars ReleaseStringUTFChars |
Obtains or releases a pointer to the contents of a string in UTF-8 format. |
| GetStringLength | Returns the number of Unicode characters in the string. |
| GetStringUTFLength | Returns the number of bytes needed to represent a string in the UTF-8 format. |
| NewString | Creates a java.lang.String instance that contains the same sequence of characters as the given Unicode C string. |
| NewStringUTF | Creates a java.lang.String instance that contains the same sequence of characters as the given UTF-8 encoded C string. |
| GetStringCritical ReleaseStringCritical |
Obtains a pointer to the contents of a string in Unicode format. May return a copy of the string. Native code must not block between a pair of Get/ReleaseStringCritical calls. |
| GetStringRegion SetStringRegion |
Copies the contents of a string to or from a preallocated C buffer in the Unicode format. |
| GetStringUTFRegion SetStringUTFRegion |
Copies the content of a string to or from a preallocated C buffer in the UTF-8 format. |
JNI String Example:
Let’s write a JNI application that passes a prompt message to a native method, which method prints the prompt message, reads the user input and sends it back to the application.
The Java code will be(NativePrompt.java):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | class NativePrompt { private native String getInput(String prompt); //native method static //static initializer code { System.loadLibrary("NativePrompt"); } public static void main(String[] args) { NativePrompt NP = new NativePrompt(); String sName = NP.getInput("Enter your name: "); System.out.println("Hello " + sName); } } |
Compile NativePrompt.java (javac NativePrompt.java) and generate hedder file(javah -jni NativePrompt).
The generated with javah header file NativePrompt.h will be:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | /* DO NOT EDIT THIS FILE - it is machine generated */ #include "jni.h" /* Header for class NativePrompt */ #ifndef _Included_NativePrompt #define _Included_NativePrompt #ifdef __cplusplus extern "C" { #endif /* * Class: NativePrompt * Method: getInput * Signature: (Ljava/lang/String;)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_NativePrompt_getInput (JNIEnv *, jobject, jstring); #ifdef __cplusplus } #endif #endif |
The C++ implementation file NativePrompt.cpp will be:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | #include "NativePrompt.h" #include "jni.h" #include "string" #include "iostream" #include "vector" using namespace std; /* * Class: NativePrompt * Method: getInput * Signature: (Ljava/lang/String;)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_NativePrompt_getInput (JNIEnv *env, jobject obj, jstring prompt){ string sEntry; const char *str; str = env->GetStringUTFChars(prompt, NULL); if (str == NULL) { return env->NewStringUTF(""); } else{ cout << str; //Frees native string resources env->ReleaseStringUTFChars(prompt, str); //reads n-consecutive words from the //keyboard and store them in string getline(cin, sEntry); return env->NewStringUTF(sEntry.c_str()); } } |
Run the program (java NativePrompt) and verify the output.
Description :
This is the one stop educational site for all Electronic and Computer students. If you want to learn something new then we are here to help. We work on Microcontroller projects, Basic Electronics, Digital electronics, Computer projects and also in basic c/c++ programs.
#Home #Sitemap #Resources #Terms of Use
Copyright©2012 electrofriends.com All Rights Reserved
Contact:info@electrofriends.com
Sorry, but Unicode is a standard, not an encoding. Do you mean UTF-16 when you say Unicode? It’s also worth pointing out that even in UTF-16 glyphs may be encoded using more than one 2-byte “element”.