HashMaps是必须访问才能获取内容的对象。所以,前面有很多代码;)
看看下面:
JNIEXPORT int JNICALL Java_recipeNo037_PassHashMap_displayHashMap
(JNIEnv *env, jclass obj, jobject objarg) {
jclass clsHashMap = (*env)->GetObjectClass(env, objarg);
jmethodID midKeySet =
(*env)->GetMethodID(env, clsHashMap, "keySet", "()Ljava/util/Set;");
if (midKeySet == NULL) {
return -1;
}
jobject objKeySet = (*env)->CallObjectMethod(env, objarg, midKeySet);
jclass clsSet = (*env)->GetObjectClass(env, objKeySet);
jmethodID midToArray =
(*env)->GetMethodID(env, clsSet, "toArray", "()[Ljava/lang/Object;");
if (midKeySet == NULL) {
return -2;
}
jobjectArray arrayOfKeys = (*env)->CallObjectMethod(env, objKeySet, midToArray);
int arraySize = (*env)->GetArrayLength(env, arrayOfKeys);
for (int i=0; i < arraySize; i++)
{
jstring objKey = (*env)->GetObjectArrayElement(env, arrayOfKeys, i);
const char* c_string_key = (*env)->GetStringUTFChars(env, objKey, 0);
jmethodID midGet =
(*env)->GetMethodID(env, clsHashMap, "get", "(Ljava/lang/Object;)Ljava/lang/Object;");
jobject objValue = (*env)->CallObjectMethod(env, objarg, midGet, objKey);
const char* c_string_value = (*env)->GetStringUTFChars(env, objValue, 0);
printf("[key, value] = [%s, %s]\n", c_string_key, c_string_value);
(*env)->ReleaseStringUTFChars(env, objKey, c_string_key);
(*env)->DeleteLocalRef(env, objKey);
(*env)->ReleaseStringUTFChars(env, objValue, c_string_value);
(*env)->DeleteLocalRef(env, objValue);
}
return 0;
}
recipeNo037
一、 就个人而言,将HashMap替换为两个数组对象。这样,可以删除大量代码。
看看这里(
recipeNo038
)对于替代方法:
这一次,我们传递了两个字符串数组。它们的对齐方式是,相应的索引包含HashMap中的键/值。这样,我们可以大大减少C语言的代码,而Java语言的开销并没有那么大。
JNIEXPORT int JNICALL Java_recipeNo038_PassHashMap_displayHashMap
(JNIEnv *env, jclass obj, jobjectArray keys, jobjectArray values) {
int arraySize = (*env)->GetArrayLength(env, keys);
for (int i=0; i < arraySize; i++)
{
jstring objKey = (*env)->GetObjectArrayElement(env, keys, i);
const char* c_string_key = (*env)->GetStringUTFChars(env, objKey, 0);
jobject objValue = (*env)->GetObjectArrayElement(env, values, i);
const char* c_string_value = (*env)->GetStringUTFChars(env, objValue, 0);
printf("[key, value] = [%s, %s]\n", c_string_key, c_string_value);
(*env)->ReleaseStringUTFChars(env, objKey, c_string_key);
(*env)->DeleteLocalRef(env, objKey);
(*env)->ReleaseStringUTFChars(env, objValue, c_string_value);
(*env)->DeleteLocalRef(env, objValue);
}
return 0;
}