在概述中基本搭建了一个jni的工程,但是有很多细节都没有讨论,这篇文件就是进一步讨论JNI技术的具体方面的,包括String的传递及使用,java的属性和方法的使用和异常抛出等。
String的使用 java的属性和方法 类的使用 异常抛出 ##String的使用
我们都知道JAVA有String这个类可以很方便地使用字符串,而在c中我们通常是用char*,那么JNI是怎么在这两种类型里转换的呢?
在之前的工程添加以下代码:
:::c static JNINativeMethod gMethods[] = { {"intToJni","(I)V", (void*)nativeIntToJni}, {"conversation","(Ljava/lang/String;)Ljava/lang/String;", (void*)nativeConversation}, }; jstring nativeConversation(JNIEnv* env, jobject clazz, jstring fromJava){ const char* message; message = (*env)->GetStringUTFChars(env,fromJava,NULL); __android_log_print(ANDROID_LOG_INFO,"TAG","message from java: %s", message); (*env)->ReleaseStringUTFChars(env, fromJava, message); return (*env)->NewStringUTF(env, "nice to see you , i am c"); } 可以看到fromJava是从java传进来的string,message是jstring转换为char*的容器。使用方法GetStringUTFChars进行转换,使用ReleaseStringUTFChars释放资源。
Warning GetStringUTFChars和ReleaseStringUTFChars需要成对出现,要不会有内存泄漏的,native想保存字符串可以使用memcpy复制一份
...