From Table-A we can learn some primitive data type of JNI.
How to get array from Java?
We can use some methods of JNIEnv object to get array from Java. And it provide two types of methods that one is that operate simple type of Array, another one is that operate Objects of Array.
So, we can use this kinds of methods "GetXXXArrayElements" to get array data from Java. Following is the detail:
How to get Field and Method from Java?
The parameters and return values:
Some cases about C use Java
1. C returns a string
(*env)->NewStringUTF(env,"hello world");
2. C returns an array
{
int i = 0;
jintArray array;
array = (*env)->NewIntArray(env,10);
for(;i<10;i++) {
(*env)->SetObjectArrayElement(env,array,i,i*2);
}
return array;
}
3. C uses input array.
{
int sum =0, i;
int len = (*env)->GetArrayLength(env,array);
jint *element = (*env)->GetIntArrayElement(env,array,0);
for(i=0;i<len;i++) {
sum += *(element+i);
}
return sum;
}
4. C uses Java methods without parameters but return String value.
JNIEXPORT jstring JNICALL jni_Demo_getCallBack(JNIENV env,jobject object){
jmethodID mid; jclass cls = (*env)->FindClass(env,"jni/Demo");
mid = (*env)->GetMethodID(env,cls,"Callback","()Ljava/lang/String;");//Callback java
jstring msg = (*env)->CallObjectMethod(env,object,mid);
return msg;
}
5. C use Java static methods without parameters but return String value.
JNIEXPORT jstring JNICALL Java_jni_Demo_getCallBack(JNIENV env,jobject object){
jmethodID mid;
jclass cls = (*env)->FindClass(env,"jni/Demo");
mid = (*env)->GeStatictMethodID(env,cls,"Callback","()Ljava/lang/String;");//Callback java
jstring msg = (*env)->CallStaticObjectMethod(env,cls,mid);
return msg;
}
6. C uses Java with two parameters one is int, another one is String and return String value.
JNIEXPORT jstring JNICALL Java_jni_Demo_getCallBack(JNIENV env,jobject object){
jmethodID mid;
jclass cls = (*env)->FindClass(env,"jni/Demo
mid = (*env)->GeStatictMethodID(env,cls,"Callback","(ILjava/lang/String;)Ljava/lang/String;");//Callback
jstring param = (*env)->NewStringUTF(env,"hello world");
jstring msg = (*env)->CallStaticObjectMethod(env,cls,mid,22,param);
return msg;
}
7. C uses Java Global Fields
{
jclass cls = (*env)->FindClass(env,"jni/Demo");
jfieldID id = (*env)->GetFieldID(env,cls,"gIntNumber","I");
jint param = (*env)->GetIntField(env,object,id);
jfieldID id2 = (*env)->GetFieldID(env,cls,"gStrName","Ljava/lang/String");
jstring param = (*env)->GetObjectField(env,object,id);
}
8. C uses Java static Fields
{
jclass cls = (*env)->FindClass(env,"jni/Demo");
jfieldID id = (*env)->GetStaticFieldID(env,cls,"staticNumber","Ljava/lang/String"); jstring param = (*env)->GeStaticObjectField(env,cls,id);
}