Moving libnativehelper additions from libcore

(cherry picked from commit b66098568f22d672aac3949a39e92d8a474e4b94)

Change-Id: I60381a253af8ee738b1dac8ec124bf13aa7f5f82
diff --git a/toStringArray.cpp b/toStringArray.cpp
new file mode 100644
index 0000000..414d43c
--- /dev/null
+++ b/toStringArray.cpp
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "JniConstants.h"
+#include "toStringArray.h"
+
+#include <string>
+#include <vector>
+
+jobjectArray newStringArray(JNIEnv* env, size_t count) {
+    return env->NewObjectArray(count, JniConstants::stringClass, NULL);
+}
+
+struct VectorCounter {
+    const std::vector<std::string>& strings;
+    VectorCounter(const std::vector<std::string>& strings) : strings(strings) {}
+    size_t operator()() {
+        return strings.size();
+    }
+};
+struct VectorGetter {
+    const std::vector<std::string>& strings;
+    VectorGetter(const std::vector<std::string>& strings) : strings(strings) {}
+    const char* operator()(size_t i) {
+        return strings[i].c_str();
+    }
+};
+
+jobjectArray toStringArray(JNIEnv* env, const std::vector<std::string>& strings) {
+    VectorCounter counter(strings);
+    VectorGetter getter(strings);
+    return toStringArray<VectorCounter, VectorGetter>(env, &counter, &getter);
+}
+
+struct ArrayCounter {
+    const char* const* strings;
+    ArrayCounter(const char* const* strings) : strings(strings) {}
+    size_t operator()() {
+        size_t count = 0;
+        while (strings[count] != NULL) {
+            ++count;
+        }
+        return count;
+    }
+};
+
+struct ArrayGetter {
+    const char* const* strings;
+    ArrayGetter(const char* const* strings) : strings(strings) {}
+    const char* operator()(size_t i) {
+        return strings[i];
+    }
+};
+
+jobjectArray toStringArray(JNIEnv* env, const char* const* strings) {
+    ArrayCounter counter(strings);
+    ArrayGetter getter(strings);
+    return toStringArray(env, &counter, &getter);
+}