aboutsummaryrefslogtreecommitdiffstats
path: root/cm/jni
diff options
context:
space:
mode:
authorSteve Kondik <steve@cyngn.com>2016-05-06 04:30:23 -0700
committerSteve Kondik <shade@chemlab.org>2016-05-06 22:25:21 -0700
commitb77b8b5a70b4a3d770dc2cee4ab78b49c82f5a28 (patch)
treeffd9e14fe09e94bb0f4f7e694193d33c4c650608 /cm/jni
parent186ae8353d02166eb893552b029758600772e8f7 (diff)
downloadvendor_cmsdk-b77b8b5a70b4a3d770dc2cee4ab78b49c82f5a28.zip
vendor_cmsdk-b77b8b5a70b4a3d770dc2cee4ab78b49c82f5a28.tar.gz
vendor_cmsdk-b77b8b5a70b4a3d770dc2cee4ab78b49c82f5a28.tar.bz2
cmsdk: Pass the process name and pid for launch boosts
* We need this for vendor perf tools. * This also adds a NativeHelper class which loads the JNI library on-demand, since we don't have an entry point. Change-Id: If76ad8f952e86366978ae9cf9d1f107febccc28b
Diffstat (limited to 'cm/jni')
-rw-r--r--cm/jni/Android.mk11
-rw-r--r--cm/jni/src/onload.cpp2
-rw-r--r--cm/jni/src/org_cyanogenmod_platform_internal_PerformanceManagerService.cpp82
3 files changed, 91 insertions, 4 deletions
diff --git a/cm/jni/Android.mk b/cm/jni/Android.mk
index 5e1da9f..3e8aae4 100644
--- a/cm/jni/Android.mk
+++ b/cm/jni/Android.mk
@@ -18,19 +18,22 @@ include $(CLEAR_VARS)
LOCAL_SRC_FILES := \
src/org_cyanogenmod_platform_internal_CMAudioService.cpp \
+ src/org_cyanogenmod_platform_internal_PerformanceManagerService.cpp \
src/onload.cpp
LOCAL_C_INCLUDES := \
$(JNI_H_INCLUDE) \
$(TOP)/frameworks/base/core/jni \
- $(TOP)/frameworks/av/include
+ $(TOP)/frameworks/av/include \
+ $(TOP)/hardware/libhardware/include
LOCAL_SHARED_LIBRARIES := \
libandroid_runtime \
- libmedia \
- liblog \
libcutils \
- libutils \
+ libhardware \
+ liblog \
+ libmedia \
+ libutils
LOCAL_MODULE := libcmsdk_platform_jni
LOCAL_MODULE_TAGS := optional
diff --git a/cm/jni/src/onload.cpp b/cm/jni/src/onload.cpp
index d9892ba..1ee8fda 100644
--- a/cm/jni/src/onload.cpp
+++ b/cm/jni/src/onload.cpp
@@ -22,6 +22,7 @@
namespace android {
int register_org_cyanogenmod_platform_internal_CMAudioService(JNIEnv* env);
+int register_org_cyanogenmod_platform_internal_PerformanceManagerService(JNIEnv* env);
};
@@ -39,6 +40,7 @@ extern "C" jint JNI_OnLoad(JavaVM* vm, void* /* reserved */)
ALOG_ASSERT(env, "Could not retrieve the env!");
register_org_cyanogenmod_platform_internal_CMAudioService(env);
+ register_org_cyanogenmod_platform_internal_PerformanceManagerService(env);
return JNI_VERSION_1_4;
}
diff --git a/cm/jni/src/org_cyanogenmod_platform_internal_PerformanceManagerService.cpp b/cm/jni/src/org_cyanogenmod_platform_internal_PerformanceManagerService.cpp
new file mode 100644
index 0000000..71c0577
--- /dev/null
+++ b/cm/jni/src/org_cyanogenmod_platform_internal_PerformanceManagerService.cpp
@@ -0,0 +1,82 @@
+/*
+**
+** Copyright 2016, The CyanogenMod 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.
+*/
+
+//#define LOG_NDEBUG 0
+
+#define LOG_TAG "PerformanceManagerService-JNI"
+
+#include <utils/Log.h>
+
+#include <JNIHelp.h>
+#include <jni.h>
+#include "core_jni_helpers.h"
+
+#include <hardware/power.h>
+
+// ----------------------------------------------------------------------------
+
+namespace android {
+
+static const char* const kClassPathName =
+ "org/cyanogenmod/platform/internal/PerformanceManagerService";
+
+static struct power_module* gPowerModule;
+
+// ----------------------------------------------------------------------------
+
+static void
+org_cyanogenmod_platform_internal_PerformanceManagerService_launchBoost(
+ JNIEnv *env, jobject thiz, jint pid, jstring jPackageName)
+{
+ if (env == NULL || jPackageName == NULL) {
+ return;
+ }
+
+ if (gPowerModule && gPowerModule->powerHint) {
+ const char *packageName = env->GetStringUTFChars(jPackageName, 0);
+ launch_boost_info_t *info = (launch_boost_info_t *)malloc(sizeof(launch_boost_info_t));
+ info->pid = pid;
+ info->packageName = packageName;
+ gPowerModule->powerHint(gPowerModule, POWER_HINT_LAUNCH_BOOST, (void *)info);
+ ALOGV("Sent LAUNCH BOOST for %s (pid=%d)", info->packageName, info->pid);
+
+ env->ReleaseStringUTFChars(jPackageName, packageName);
+ free(info);
+ }
+}
+
+// ----------------------------------------------------------------------------
+
+static JNINativeMethod gMethods[] = {
+ {"native_launchBoost", "(ILjava/lang/String;)V",
+ (void *)org_cyanogenmod_platform_internal_PerformanceManagerService_launchBoost},
+};
+
+int register_org_cyanogenmod_platform_internal_PerformanceManagerService(JNIEnv *env)
+{
+ status_t err = hw_get_module(POWER_HARDWARE_MODULE_ID,
+ (hw_module_t const**)&gPowerModule);
+ if (!err) {
+ gPowerModule->init(gPowerModule);
+ } else {
+ ALOGE("Couldn't load %s module (%s)", POWER_HARDWARE_MODULE_ID, strerror(-err));
+ }
+
+ return RegisterMethodsOrDie(env, kClassPathName, gMethods, NELEM(gMethods));
+}
+
+} /* namespace android */