Browse Source

Fixing compilation under Windows

tags/light-jdk8u5+36
Ivan Dubrov 10 years ago
parent
commit
112ea81c32
5 changed files with 29 additions and 178 deletions
  1. 19
    1
      build.gradle
  2. 1
    3
      native/compile.cmd
  3. 3
    140
      native/natives.c
  4. 5
    33
      native/natives.h
  5. 1
    1
      settings.gradle

+ 19
- 1
build.gradle View File

@@ -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'
}

+ 1
- 3
native/compile.cmd View File

@@ -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

+ 3
- 140
native/natives.c View File

@@ -28,147 +28,10 @@
#include <stdlib.h>
#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, "<init>", "(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;
}

}

+ 5
- 33
native/natives.h View File

@@ -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

+ 1
- 1
settings.gradle View File

@@ -1 +1 @@
include 'agent', 'dcevm', 'hotspot'
include 'agent', 'dcevm', 'hotspot', 'native'

Loading…
Cancel
Save