From 112ea81c3236d4591cbbb44043bd8511024bf3b5 Mon Sep 17 00:00:00 2001 From: Ivan Dubrov Date: Fri, 25 Apr 2014 16:06:44 -0700 Subject: [PATCH] Fixing compilation under Windows --- build.gradle | 20 ++++++- native/compile.cmd | 4 +- native/natives.c | 143 +-------------------------------------------- native/natives.h | 38 ++---------- settings.gradle | 2 +- 5 files changed, 29 insertions(+), 178 deletions(-) diff --git a/build.gradle b/build.gradle index f0d0944b..62692747 100644 --- a/build.gradle +++ b/build.gradle @@ -127,11 +127,29 @@ project('agent') { } } +project('native') { + task compile(type: Exec) { + if (root.os != Os.WINDOWS) { + commandLine 'gcc' + args "-I${jre}/../include" + args "-I${jre}/../include/linux" + args '-shared' + args 'natives.c' + args '-o' + args 'build/libnatives.so' + } else { + commandLine 'compile.cmd' + environment ARCH: root.arch == Arch.X86 ? 'x86' : 'x64' + environment JAVA_HOME: jre + } + } +} + project('dcevm') { dependencies { compile project(':agent') compile group: 'asm', name: 'asm-all', version: '3.3.+' - compile files(System.getProperty("java.home") + '/../lib/tools.jar') + compile files(jre + '/../lib/tools.jar') testCompile group: 'junit', name: 'junit', version: '4.11' } diff --git a/native/compile.cmd b/native/compile.cmd index a6c8b41c..c1c4f9a8 100644 --- a/native/compile.cmd +++ b/native/compile.cmd @@ -1,6 +1,4 @@ set WINDOWS_SDK=c:\Program Files\Microsoft SDKs\Windows\v7.1 call "%WINDOWS_SDK%\bin\setenv.cmd" /%ARCH% -call %VC%\vcvarsall.bat - -%VC%\bin\cl /I%JAVA_HOME%\include /I%JAVA_HOME%\include\win32 /I%VC%\include /I%VC%\lib /I%MSDK%\Lib libHelloWorld.c /FelibHelloWorld.dll /LD +%VC%\bin\cl /I%JAVA_HOME%\include /I%JAVA_HOME%\include\win32 natives.c /Fenatives.dll /LD diff --git a/native/natives.c b/native/natives.c index 9c40f2c7..aecaa62c 100644 --- a/native/natives.c +++ b/native/natives.c @@ -28,147 +28,10 @@ #include #include "natives.h" -JNIEXPORT jint JNICALL Java_at_ssw_hotswap_test_natives_SimpleNativeTest_00024A_value(JNIEnv *env, jclass c) { +JNIEXPORT jint JNICALL Java_com_github_dcevm_test_natives_SimpleNativeTest_00024A_value(JNIEnv *env, jclass c) { return 1; } -JNIEXPORT jint JNICALL Java_at_ssw_hotswap_test_natives_SimpleNativeTest_00024A_value2(JNIEnv *env, jclass c) { +JNIEXPORT jint JNICALL Java_com_github_dcevm_test_natives_SimpleNativeTest_00024A_value2(JNIEnv *env, jclass c) { return 2; -} - -JNIEXPORT jclass JNICALL Java_at_ssw_hotswap_test_access_jni_JNIVMAccess_findClassNative(JNIEnv *env, jclass c, jstring s) { - const char* name = (*env)->GetStringUTFChars(env, s, 0); - jclass clazz = (*env)->FindClass(env, name); - (*env)->ReleaseStringUTFChars(env, s, name); - return clazz; -} - -JNIEXPORT jobject JNICALL Java_at_ssw_hotswap_test_access_jni_JNIClassAccess_findMethodNative(JNIEnv *env, jclass c, jclass cls, jstring methodName) { - const char *methodstr = (*env)->GetStringUTFChars(env, methodName, 0); - - jclass jCls = (*env)->GetObjectClass(env, cls); - - // Get Method ID of getMethods() - jmethodID midGetFields = (*env)->GetMethodID(env, jCls, "getDeclaredMethods", "()[Ljava/lang/reflect/Method;"); - (*env)->ExceptionDescribe(env); - jobjectArray jobjArray = (jobjectArray) (*env)->CallObjectMethod(env, cls, midGetFields); - - jsize len = (*env)->GetArrayLength(env, jobjArray); - jsize i = 0; - - for (i = 0; i < len; i++) { - jobject _strMethod = (*env)->GetObjectArrayElement(env, jobjArray, i); - jclass _methodClazz = (*env)->GetObjectClass(env, _strMethod); - jmethodID mid = (*env)->GetMethodID(env, _methodClazz, "getName", "()Ljava/lang/String;"); - jstring _name = (jstring) (*env)->CallObjectMethod(env, _strMethod, mid); - - const char *str = (*env)->GetStringUTFChars(env, _name, 0); - - if (strcmp(str, methodstr) == 0) { - (*env)->ReleaseStringUTFChars(env, methodName, methodstr); - (*env)->ReleaseStringUTFChars(env, _name, str); - return _strMethod; - } - (*env)->ReleaseStringUTFChars(env, _name, str); - } - - jclass exc = (*env)->FindClass(env, "java/lang/NoSuchMethodError"); - (*env)->ThrowNew(env, exc, methodstr); - (*env)->ReleaseStringUTFChars(env, methodName, methodstr); - -} - -JNIEXPORT jobjectArray JNICALL Java_at_ssw_hotswap_test_access_jni_JNIClassAccess_getMethodsNative(JNIEnv *env, jclass c, jclass cls) { - jobjectArray array; - - jclass jCls = (*env)->GetObjectClass(env, cls); - - // Get Method ID of getMethods() - jmethodID midGetFields = (*env)->GetMethodID(env, jCls, "getDeclaredMethods", "()[Ljava/lang/reflect/Method;"); - (*env)->ExceptionDescribe(env); - jobjectArray jobjArray = (jobjectArray) (*env)->CallObjectMethod(env, cls, midGetFields); - - jsize len = (*env)->GetArrayLength(env, jobjArray); - jsize i = 0; - - array = (*env)->NewObjectArray(env, len, (*env)->FindClass(env, "java/lang/reflect/Method"), 0); - - for (i = 0; i < len; i++) { - jobject _strMethod = (*env)->GetObjectArrayElement(env, jobjArray, i); - (*env)->SetObjectArrayElement(env, array, i, _strMethod); - } - - return array; -} - -jobject callVoidMethod(JNIEnv *env, jobject obj, jboolean staticValue, jmethodID methodID, jvalue *params) { - if (staticValue) { - (*env)->CallStaticVoidMethodA(env, obj, methodID, params); - } else { - (*env)->CallVoidMethodA(env, obj, methodID, params); - } - return (*env)->NewGlobalRef(env, NULL); -} - -jobject callIntMethod(JNIEnv *env, jobject obj, jboolean staticValue, jmethodID methodID, jvalue *params) { - jint intValue; - if (staticValue) { - intValue = (*env)->CallStaticIntMethodA(env, obj, methodID, params); - } else { - intValue = (*env)->CallIntMethodA(env, obj, methodID, params); - } - jclass clazz = (*env)->FindClass(env, "Ljava/lang/Integer;"); - jmethodID methodIDInteger = (*env)->GetMethodID(env, clazz, "", "(I)V"); - return (*env)->NewObject(env, clazz, methodIDInteger, intValue); -} - -jobject callObjectMethod(JNIEnv *env, jobject obj, jboolean staticValue, jmethodID methodID, jvalue *params) { - if (staticValue) { - return (*env)->CallStaticObjectMethodA(env, obj, methodID, params); - } else { - return (*env)->CallObjectMethodA(env, obj, methodID, params); - } -} - -JNIEXPORT jobject JNICALL Java_at_ssw_hotswap_test_access_jni_JNIMethodAccess_invokeMethodNative(JNIEnv *env, jclass c, jclass cls, jobject obj, jstring methodName, jstring retValue, jboolean staticValue, jstring descriptor, jobjectArray params) { - const char *methodstr = (*env)->GetStringUTFChars(env, methodName, 0); - const char *descriptorstr = (*env)->GetStringUTFChars(env, descriptor, 0); - const char *retValuestr = (*env)->GetStringUTFChars(env, retValue, 0); - - jmethodID methodID; - if (staticValue) { - methodID = (*env)->GetStaticMethodID(env, cls, methodstr, descriptorstr); - } else { - methodID = (*env)->GetMethodID(env, cls, methodstr, descriptorstr); - } - - jsize len = (*env)->GetArrayLength(env, params); - jvalue *m = (jvalue*) malloc(sizeof (jvalue) * len); - - jvalue *mm = m; - int i = 0; - for (i; i < len; i++) { - *mm = (jvalue)(*env)->GetObjectArrayElement(env, params, i); - mm += 1; - } - - jobject object = (*env)->NewGlobalRef(env, NULL); - - if (strcmp(retValuestr, "void") == 0) { - object = callVoidMethod(env, obj, staticValue, methodID, m); - } else if (strcmp(retValuestr, "int") == 0) { - object = callIntMethod(env, obj, staticValue, methodID, m); - } else if (strcmp(retValuestr, "java.lang.Object") == 0) { - object = callObjectMethod(env, obj, staticValue, methodID, m); - } else { - jclass exc = (*env)->FindClass(env, "java.lang.NotImplementedException"); - (*env)->ThrowNew(env, exc, "required retValue: bool/int/object"); - } - - (*env)->ReleaseStringUTFChars(env, methodName, methodstr); - (*env)->ReleaseStringUTFChars(env, descriptor, descriptorstr); - (*env)->ReleaseStringUTFChars(env, retValue, retValuestr); - - return object; -} - +} \ No newline at end of file diff --git a/native/natives.h b/native/natives.h index 90fcf920..53a02be7 100644 --- a/native/natives.h +++ b/native/natives.h @@ -28,45 +28,17 @@ #define NATIVES /* - * Class: at_ssw_hotswap_test_natives_SimpleNativeTest_A + * Class: com_github_dcevm_test_natives_SimpleNativeTest_A * Method: value * Signature: ()I */ -JNIEXPORT jint JNICALL Java_at_ssw_hotswap_test_natives_SimpleNativeTest_00024A_value(JNIEnv *, jclass); +JNIEXPORT jint JNICALL Java_com_github_dcevm_test_natives_SimpleNativeTest_00024A_value(JNIEnv *, jclass); /* - * Class: at_ssw_hotswap_test_natives_SimpleNativeTest_A + * Class: com_github_dcevm_test_natives_SimpleNativeTest_A * Method: value2 * Signature: ()I */ -JNIEXPORT jint JNICALL Java_at_ssw_hotswap_test_natives_SimpleNativeTest_00024A_value2(JNIEnv *, jclass); +JNIEXPORT jint JNICALL Java_com_github_dcevm_test_natives_SimpleNativeTest_00024A_value2(JNIEnv *, jclass); -/* - * Class: at_ssw_hotswap_test_access_jni_JNIVMAccess - * Method: findClass - * Signature: (String)Class - */ -JNIEXPORT jclass JNICALL Java_at_ssw_hotswap_test_access_jni_JNIVMAccess_findClassNative(JNIEnv *, jclass, jstring); - -/* - * Class: at_ssw_hotswap_test_access_jni_JNIClassAccess - * Method: findMethod - * Signature: (Class, String)Object - */ -JNIEXPORT jobject JNICALL Java_at_ssw_hotswap_test_access_jni_JNIClassAccess_findMethodNative(JNIEnv *, jclass, jclass, jstring); - -/* - * Class: at_ssw_hotswap_test_access_jni_JNIClassAccess - * Method: getMethods - * Signature: (Class)Object[] - */ -JNIEXPORT jobjectArray JNICALL Java_at_ssw_hotswap_test_access_jni_JNIClassAccess_getMethodsNative(JNIEnv *, jclass, jclass); - -/* - * Class: at_ssw_hotswap_test_access_jni_JNIMethodAccess - * Method: invokeMethod - * Signature: (Class, String, Object)Value - */ -JNIEXPORT jobject JNICALL Java_at_ssw_hotswap_test_access_jni_JNIMethodAccess_invokeMethod(JNIEnv *, jclass, jclass, jobject, jstring, jstring, jboolean, jstring); - -#endif +#endif // NATIVES \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 0efe97e3..bb9e7fe0 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include 'agent', 'dcevm', 'hotspot' +include 'agent', 'dcevm', 'hotspot', 'native' -- 2.39.5