init jvmtiEnv through JNI_OnLoad method.

pull/1784/head
hengyunabc 4 years ago
parent 46273d2685
commit fe22e0f4fb

@ -4,21 +4,40 @@
#include <jvmti.h> #include <jvmti.h>
#include "arthas_VmTool.h" // under target/native/javah/ #include "arthas_VmTool.h" // under target/native/javah/
static jvmtiEnv *jvmti;
extern "C" extern "C"
jvmtiEnv *getJvmtiEnv(JNIEnv *env) { int init_agent(JavaVM *vm, void *reserved) {
jint rc;
/* Get JVMTI environment */
rc = vm->GetEnv((void **)&jvmti, JVMTI_VERSION_1_2);
if (rc != JNI_OK) {
fprintf(stderr, "ERROR: arthas vmtool Unable to create jvmtiEnv, GetEnv failed, error=%d\n", rc);
return -1;
}
return JNI_OK;
}
JavaVM *vm; extern "C" JNIEXPORT jint JNICALL
env->GetJavaVM(&vm); Agent_OnLoad(JavaVM *vm, char *options, void *reserved) {
return init_agent(vm, reserved);
}
jvmtiEnv *jvmti; extern "C" JNIEXPORT jint JNICALL
vm->GetEnv((void **) &jvmti, JVMTI_VERSION_1_2); Agent_OnAttach(JavaVM* vm, char* options, void* reserved) {
return jvmti; return init_agent(vm, reserved);
}
extern "C" JNIEXPORT jint JNICALL
JNI_OnLoad(JavaVM* vm, void* reserved) {
init_agent(vm, reserved);
return JNI_VERSION_1_6;
} }
extern "C" extern "C"
JNIEXPORT void JNICALL JNIEXPORT void JNICALL
Java_arthas_VmTool_forceGc0(JNIEnv *env, jclass thisClass) { Java_arthas_VmTool_forceGc0(JNIEnv *env, jclass thisClass) {
jvmtiEnv *jvmti = getJvmtiEnv(env);
jvmti->ForceGarbageCollection(); jvmti->ForceGarbageCollection();
} }
@ -55,9 +74,6 @@ HeapObjectCallback(jlong class_tag, jlong size, jlong *tag_ptr, void *user_data)
extern "C" extern "C"
JNIEXPORT jobjectArray JNICALL JNIEXPORT jobjectArray JNICALL
Java_arthas_VmTool_getInstances0(JNIEnv *env, jclass thisClass, jclass klass) { Java_arthas_VmTool_getInstances0(JNIEnv *env, jclass thisClass, jclass klass) {
jvmtiEnv *jvmti = getJvmtiEnv(env);
jvmtiCapabilities capabilities = {0}; jvmtiCapabilities capabilities = {0};
capabilities.can_tag_objects = 1; capabilities.can_tag_objects = 1;
jvmtiError error = jvmti->AddCapabilities(&capabilities); jvmtiError error = jvmti->AddCapabilities(&capabilities);
@ -94,9 +110,6 @@ Java_arthas_VmTool_getInstances0(JNIEnv *env, jclass thisClass, jclass klass) {
extern "C" extern "C"
JNIEXPORT jlong JNICALL JNIEXPORT jlong JNICALL
Java_arthas_VmTool_sumInstanceSize0(JNIEnv *env, jclass thisClass, jclass klass) { Java_arthas_VmTool_sumInstanceSize0(JNIEnv *env, jclass thisClass, jclass klass) {
jvmtiEnv *jvmti = getJvmtiEnv(env);
jvmtiCapabilities capabilities = {0}; jvmtiCapabilities capabilities = {0};
capabilities.can_tag_objects = 1; capabilities.can_tag_objects = 1;
jvmtiError error = jvmti->AddCapabilities(&capabilities); jvmtiError error = jvmti->AddCapabilities(&capabilities);
@ -134,9 +147,6 @@ Java_arthas_VmTool_sumInstanceSize0(JNIEnv *env, jclass thisClass, jclass klass)
extern "C" extern "C"
JNIEXPORT jlong JNICALL Java_arthas_VmTool_getInstanceSize0 JNIEXPORT jlong JNICALL Java_arthas_VmTool_getInstanceSize0
(JNIEnv *env, jclass thisClass, jobject instance) { (JNIEnv *env, jclass thisClass, jobject instance) {
jvmtiEnv *jvmti = getJvmtiEnv(env);
jlong size = -1; jlong size = -1;
jvmtiError error = jvmti->GetObjectSize(instance, &size); jvmtiError error = jvmti->GetObjectSize(instance, &size);
if (error) { if (error) {
@ -149,9 +159,6 @@ JNIEXPORT jlong JNICALL Java_arthas_VmTool_getInstanceSize0
extern "C" extern "C"
JNIEXPORT jlong JNICALL JNIEXPORT jlong JNICALL
Java_arthas_VmTool_countInstances0(JNIEnv *env, jclass thisClass, jclass klass) { Java_arthas_VmTool_countInstances0(JNIEnv *env, jclass thisClass, jclass klass) {
jvmtiEnv *jvmti = getJvmtiEnv(env);
jvmtiCapabilities capabilities = {0}; jvmtiCapabilities capabilities = {0};
capabilities.can_tag_objects = 1; capabilities.can_tag_objects = 1;
jvmtiError error = jvmti->AddCapabilities(&capabilities); jvmtiError error = jvmti->AddCapabilities(&capabilities);
@ -180,9 +187,6 @@ Java_arthas_VmTool_countInstances0(JNIEnv *env, jclass thisClass, jclass klass)
extern "C" extern "C"
JNIEXPORT jobjectArray JNICALL Java_arthas_VmTool_getAllLoadedClasses0 JNIEXPORT jobjectArray JNICALL Java_arthas_VmTool_getAllLoadedClasses0
(JNIEnv *env, jclass thisClass, jclass kclass) { (JNIEnv *env, jclass thisClass, jclass kclass) {
jvmtiEnv *jvmti = getJvmtiEnv(env);
jclass *classes; jclass *classes;
jint count = 0; jint count = 0;

Loading…
Cancel
Save