Android-jni技术-II
在概述中基本搭建了一个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复制一份 顺便说说,貌似getStringRegion不用释放。对于JAVA的数组,也是不能直接使用的,需要做像String一样的处理。 JNI String 方法的汇总 JNI Function Description Since GetStringChars ReleaseStringChars Obtains or releases a pointer to the contents of a string in Unicode format....