command_line_android.cc 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. // Copyright 2013 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "base/android/jni_array.h"
  5. #include "base/android/jni_string.h"
  6. #include "base/base_jni_headers/CommandLine_jni.h"
  7. #include "base/command_line.h"
  8. using base::android::ConvertUTF8ToJavaString;
  9. using base::android::ConvertJavaStringToUTF8;
  10. using base::android::JavaParamRef;
  11. using base::android::ScopedJavaLocalRef;
  12. using base::CommandLine;
  13. namespace {
  14. void JNI_CommandLine_AppendJavaStringArrayToCommandLine(
  15. JNIEnv* env,
  16. const JavaParamRef<jobjectArray>& array,
  17. bool includes_program) {
  18. std::vector<std::string> vec;
  19. if (array)
  20. base::android::AppendJavaStringArrayToStringVector(env, array, &vec);
  21. if (!includes_program)
  22. vec.insert(vec.begin(), std::string());
  23. CommandLine extra_command_line(vec);
  24. CommandLine::ForCurrentProcess()->AppendArguments(extra_command_line,
  25. includes_program);
  26. }
  27. } // namespace
  28. static jboolean JNI_CommandLine_HasSwitch(
  29. JNIEnv* env,
  30. const JavaParamRef<jstring>& jswitch) {
  31. std::string switch_string(ConvertJavaStringToUTF8(env, jswitch));
  32. return CommandLine::ForCurrentProcess()->HasSwitch(switch_string);
  33. }
  34. static ScopedJavaLocalRef<jstring> JNI_CommandLine_GetSwitchValue(
  35. JNIEnv* env,
  36. const JavaParamRef<jstring>& jswitch) {
  37. std::string switch_string(ConvertJavaStringToUTF8(env, jswitch));
  38. std::string value(CommandLine::ForCurrentProcess()->GetSwitchValueNative(
  39. switch_string));
  40. if (value.empty())
  41. return ScopedJavaLocalRef<jstring>();
  42. return ConvertUTF8ToJavaString(env, value);
  43. }
  44. static ScopedJavaLocalRef<jobjectArray> JNI_CommandLine_GetSwitchesFlattened(
  45. JNIEnv* env) {
  46. // JNI doesn't support returning Maps. Instead, express this map as a 1
  47. // dimensional array: [ key1, value1, key2, value2, ... ]
  48. std::vector<std::string> keys_and_values;
  49. for (const auto& entry : CommandLine::ForCurrentProcess()->GetSwitches()) {
  50. keys_and_values.push_back(entry.first);
  51. keys_and_values.push_back(entry.second);
  52. }
  53. return base::android::ToJavaArrayOfStrings(env, keys_and_values);
  54. }
  55. static void JNI_CommandLine_AppendSwitch(JNIEnv* env,
  56. const JavaParamRef<jstring>& jswitch) {
  57. std::string switch_string(ConvertJavaStringToUTF8(env, jswitch));
  58. CommandLine::ForCurrentProcess()->AppendSwitch(switch_string);
  59. }
  60. static void JNI_CommandLine_AppendSwitchWithValue(
  61. JNIEnv* env,
  62. const JavaParamRef<jstring>& jswitch,
  63. const JavaParamRef<jstring>& jvalue) {
  64. std::string switch_string(ConvertJavaStringToUTF8(env, jswitch));
  65. std::string value_string(ConvertJavaStringToUTF8(env, jvalue));
  66. CommandLine::ForCurrentProcess()->AppendSwitchASCII(switch_string,
  67. value_string);
  68. }
  69. static void JNI_CommandLine_AppendSwitchesAndArguments(
  70. JNIEnv* env,
  71. const JavaParamRef<jobjectArray>& array) {
  72. JNI_CommandLine_AppendJavaStringArrayToCommandLine(env, array, false);
  73. }
  74. static void JNI_CommandLine_RemoveSwitch(JNIEnv* env,
  75. const JavaParamRef<jstring>& jswitch) {
  76. std::string switch_string(ConvertJavaStringToUTF8(env, jswitch));
  77. CommandLine::ForCurrentProcess()->RemoveSwitch(switch_string);
  78. }
  79. static void JNI_CommandLine_Init(
  80. JNIEnv* env,
  81. const JavaParamRef<jobjectArray>& init_command_line) {
  82. // TODO(port): Make an overload of Init() that takes StringVector rather than
  83. // have to round-trip via AppendArguments.
  84. CommandLine::Init(0, nullptr);
  85. JNI_CommandLine_AppendJavaStringArrayToCommandLine(env, init_command_line,
  86. true);
  87. }