From 22860d2f33f4f1269eebe16f1e8118cc10d8bda0 Mon Sep 17 00:00:00 2001 From: Dennis Shen Date: Fri, 28 Jul 2023 19:14:09 +0000 Subject: [PATCH] Update codelab system app to use native code Bug: b/291771121 Test: tested on local devices Change-Id: I1532d89ef185c584d3cc76c0541a0f47e622e3fb Merged-In: I1532d89ef185c584d3cc76c0541a0f47e622e3fb --- samples/AconfigDemo/Android.bp | 36 +++++++++++++++++-- .../AconfigDemo/aconfig_demo_flags.aconfig | 7 ++++ .../aconfig/demo/AconfigDemoActivity.java | 12 +++++-- samples/AconfigDemo/src/example_cpp_lib.cc | 34 ++++++++++++++++++ .../AconfigDemo/src/include/example_cpp_lib.h | 7 ++++ 5 files changed, 91 insertions(+), 5 deletions(-) create mode 100644 samples/AconfigDemo/src/example_cpp_lib.cc create mode 100644 samples/AconfigDemo/src/include/example_cpp_lib.h diff --git a/samples/AconfigDemo/Android.bp b/samples/AconfigDemo/Android.bp index 7f17e8c69..a4ee61099 100644 --- a/samples/AconfigDemo/Android.bp +++ b/samples/AconfigDemo/Android.bp @@ -8,13 +8,16 @@ android_app { srcs: [ "src/**/*.java" ], + platform_apis: true, certificate: "platform", - sdk_version: "current", static_libs: [ "ContentLibs", "dagger2", "jsr330", ], + jni_libs: [ + "libexample_cpp_lib", + ], optimize: { enabled: true, proguard_compatibility: false, @@ -35,7 +38,7 @@ aconfig_declarations { java_aconfig_library { - name: "aconfig_demo_flags_lib", + name: "aconfig_demo_flags_java_lib", aconfig_declarations: "aconfig_demo_flags", } @@ -53,7 +56,34 @@ java_library { ], sdk_version: "current", static_libs: [ - "aconfig_demo_flags_lib", + "aconfig_demo_flags_java_lib", ], libs: ["jsr330"], } + +cc_aconfig_library { + name: "aconfig_demo_flags_c_lib", + aconfig_declarations: "aconfig_demo_flags", +} + +cc_library { + name: "libexample_cpp_lib", + srcs: ["src/example_cpp_lib.cc"], + double_loadable: true, + cflags: [ + "-Wall", + "-Werror", + "-Wno-unused-function", + "-Wno-unused-parameter", + ], + header_libs: [ + "jni_headers", + ], + shared_libs: [ + "server_configurable_flags", + ], + static_libs: [ + "aconfig_demo_flags_c_lib", + ], + export_include_dirs: ["src/include"], +} diff --git a/samples/AconfigDemo/aconfig_demo_flags.aconfig b/samples/AconfigDemo/aconfig_demo_flags.aconfig index 2a3fb999f..3f1f7b2fe 100644 --- a/samples/AconfigDemo/aconfig_demo_flags.aconfig +++ b/samples/AconfigDemo/aconfig_demo_flags.aconfig @@ -28,6 +28,13 @@ flag { bug: "287644619" } +flag { + name: "fifth_flag" + namespace: "configuration" + description: "The fifth flag, added right after the first three flags." + bug: "287644619" +} + flag { name: "third_flag" namespace: "configuration" diff --git a/samples/AconfigDemo/src/com/example/android/aconfig/demo/AconfigDemoActivity.java b/samples/AconfigDemo/src/com/example/android/aconfig/demo/AconfigDemoActivity.java index ed0d683fa..ab16d219e 100644 --- a/samples/AconfigDemo/src/com/example/android/aconfig/demo/AconfigDemoActivity.java +++ b/samples/AconfigDemo/src/com/example/android/aconfig/demo/AconfigDemoActivity.java @@ -43,13 +43,16 @@ public class AconfigDemoActivity extends Activity { setContentView(R.layout.main); TextView simpleTextView = (TextView) findViewById(R.id.simpleTextView); - simpleTextView.setText("Show Flags: \n\n"); + simpleTextView.setText("Show Java Flags: \n\n"); StaticContent cp = new StaticContent(); simpleTextView.append(cp.getContent()); simpleTextView.append(injectedContent.getContent()); + simpleTextView.append("Show C/C++ Flags: \n\n"); + simpleTextView.append(printCFlag()); + if (Flags.awesomeFlag1()) { Log.v("AconfigDemoActivity", Flags.FLAG_AWESOME_FLAG_1 + " is on!"); } @@ -58,5 +61,10 @@ public class AconfigDemoActivity extends Activity { Log.v("AconfigDemoActivity", Flags.FLAG_AWESOME_FLAG_2 + " is on!"); } } -} + public native String printCFlag(); + + static { + System.loadLibrary("example_cpp_lib"); + } +} diff --git a/samples/AconfigDemo/src/example_cpp_lib.cc b/samples/AconfigDemo/src/example_cpp_lib.cc new file mode 100644 index 000000000..878610f5b --- /dev/null +++ b/samples/AconfigDemo/src/example_cpp_lib.cc @@ -0,0 +1,34 @@ +#include "example_cpp_lib.h" +#include +#include + +namespace demo_flags = com::example::android::aconfig::demo::flags; + +// use static methods interface +static std::string get_flag_via_static_interface() { + return std::string("flag value : ") + + (demo_flags::append_static_content() ? "true" : "false"); +} + +// use flag provider for injection interface +static std::string get_flag_via_injection_interface( + demo_flags::flag_provider_interface* provider) { + return std::string("flag value : ") + + ((provider->append_injected_content()) ? "true" : "false"); +} + +jstring Java_com_example_android_aconfig_demo_AconfigDemoActivity_printCFlag( + JNIEnv* env, + jobject thiz) { + auto result = std::string("flag name : append_static_content\n"); + result += "use pattern : static method\n"; + result += get_flag_via_static_interface(); + + result += "\n\n"; + + result += "flag name : append_injected_content\n"; + result += "use pattern : injection\n"; + result += get_flag_via_injection_interface(demo_flags::provider_.get()); + + return env->NewStringUTF(result.c_str()); +} diff --git a/samples/AconfigDemo/src/include/example_cpp_lib.h b/samples/AconfigDemo/src/include/example_cpp_lib.h new file mode 100644 index 000000000..ed95fbace --- /dev/null +++ b/samples/AconfigDemo/src/include/example_cpp_lib.h @@ -0,0 +1,7 @@ +#pragma once + +#include + +extern "C" jstring Java_com_example_android_aconfig_demo_AconfigDemoActivity_printCFlag( + JNIEnv* env, + jobject thiz);