.c file:
#include <stdio.h>
#include <jni.h>
#include <stdlib.h>
#include <string.h>
#include "Prompt.h"
JNIEXPORT jstring JNICALL Java_Prompt_getLine
(JNIEnv *env, jobject this, jstring prompt){
char buf[128];
const jbyte *str;
str = (*env)->GetStringUTFChars(env, prompt, NULL);
//There are two methods to get the length of a String.
//1. strlen(jbyte cstring)
//2. (*env)->GetStringUTFLength(env, prompt)
printf("The length of String is (by str.strlen) : %d\n",(int)strlen(str));
printf("The length of String is (by GetStringUTFLength) : %d\n",(int)(*env)->GetStringUTFLength(env, prompt));
if (str == NULL){
return NULL;
}
printf("%s", str);
(*env)->ReleaseStringUTFChars(env, prompt, str);
scanf("%s" , buf);
return (*env)->NewStringUTF(env,buf);
}
.java file
class Prompt{
//native method that prints a prompt and reads a line
private native String getLine(String prompt);
public static void main(String args[]){
Prompt p = new Prompt();
String input = p.getLine("Type a line : ");
System.out.println("User typed : " + input);
}
static {
System.loadLibrary("Prompt");
}
}
How to pass a string to Native c:
1. use jstring as a parameter.
2. convert it to c:
const jbyte *str;
str = (*env)->GetStringUTFChars(env, prompt, NULL);
Two ways to get the length of String
1. strlen(jbyte* str)
2.
(*env)->GetStringUTFLength(env, prompt)
How to construct a new String
<span style="white-space:pre"> </span>(*env)->NewStringUTF(env,buf);
Other methods to get a String
GetStringCritical
jstring jstr1;
jchar *s1;
s1 = (*env)->GetStringCritical(env,jstr1);
/*
use s1.
*/
(*env)->ReleaseStringCritical(env,jstr1,s1);
GetStringUTFRegion
jstring prompt
char outbuf[128];
int len = (*env)->GetStringLength(env, prompt);
(*env)->GetStringUTFRegion(env,prompt,0,len,outbuf);