Sample app adding two ints
diff --git a/app/Android.bp b/app/Android.bp
new file mode 100644
index 0000000..641904e
--- /dev/null
+++ b/app/Android.bp
@@ -0,0 +1,49 @@
+// Copyright (C) 2020 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.
+
+aidl_interface {
+    name: "kvm_app_aidl",
+    unstable: true,
+    srcs: [
+        "foo/IFoo.aidl",
+    ],
+}
+
+cc_defaults {
+    name: "kvm_app_defaults",
+    shared_libs: [
+        "libbase",
+        "libbinder",
+        "libutils",
+    ],
+    static_libs: [
+        "kvm_app_aidl-cpp",
+    ]
+}
+
+cc_binary {
+    name: "kvm_app_client",
+    defaults: ["kvm_app_defaults"],
+    srcs: [
+        "client.cpp",
+    ],
+}
+
+cc_binary {
+    name: "kvm_app_server",
+    defaults: ["kvm_app_defaults"],
+    srcs: [
+        "server.cpp",
+    ],
+}
diff --git a/app/client.cpp b/app/client.cpp
new file mode 100644
index 0000000..aea86b2
--- /dev/null
+++ b/app/client.cpp
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2020 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 <iostream>
+#include <cstdlib>
+
+#include <binder/IBinder.h>
+#include <binder/IInterface.h>
+#include <binder/IPCThreadState.h>
+#include <binder/IServiceManager.h>
+#include <binder/ProcessState.h>
+#include <binder/TextOutput.h>
+#include <foo/BpFoo.h>
+#include <utils/Log.h>
+#include <utils/RefBase.h>
+
+using namespace android;
+
+int main(void) {
+	int sum;
+	sp<IServiceManager> sm = android::defaultServiceManager();
+	sp<IBinder> binder = sm->getService(String16("foo.IFoo"));
+	// TODO: Assert that binder is not 0.
+	sp<foo::IFoo> demo = interface_cast<foo::IFoo>(binder);
+	std::cout << "ADD 1 + 2" << std::endl;
+	binder::Status status = demo->add(1, 2, &sum);
+	std::cout << "=> " << sum << std::endl;
+	return 0;
+}
diff --git a/app/foo/IFoo.aidl b/app/foo/IFoo.aidl
new file mode 100644
index 0000000..cea4c1b
--- /dev/null
+++ b/app/foo/IFoo.aidl
@@ -0,0 +1,5 @@
+package foo;
+
+interface IFoo {
+	int add(int a, int b);
+}
diff --git a/app/server.cpp b/app/server.cpp
new file mode 100644
index 0000000..0dae0d5
--- /dev/null
+++ b/app/server.cpp
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2020 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 <binder/IBinder.h>
+#include <binder/IInterface.h>
+#include <binder/IPCThreadState.h>
+#include <binder/IServiceManager.h>
+#include <binder/ProcessState.h>
+#include <binder/TextOutput.h>
+#include <foo/BnFoo.h>
+#include <stdlib.h>
+#include <utils/Log.h>
+#include <utils/RefBase.h>
+
+using namespace android;
+
+class Demo : public foo::BnFoo {
+	virtual binder::Status add(int32_t a, int32_t b, int32_t* _aidl_return) {
+		std::cout << "adding " << a << " + " << b << std::endl;
+		*_aidl_return = a + b;
+		std::cout << "returning " << *_aidl_return << std::endl;
+		return binder::Status::ok();
+	}
+};
+
+int main(void) {
+	defaultServiceManager()->addService(String16("foo.IFoo"), new Demo());
+	ProcessState::self()->startThreadPool();
+	IPCThreadState::self()->joinThreadPool();
+	return 0;
+}