|
@@ -38,9 +38,41 @@ JNIEXPORT jboolean JNICALL Java_org_apache_hadoop_util_NativeCodeLoader_buildSup
|
|
JNIEXPORT jstring JNICALL Java_org_apache_hadoop_util_NativeCodeLoader_getLibraryName
|
|
JNIEXPORT jstring JNICALL Java_org_apache_hadoop_util_NativeCodeLoader_getLibraryName
|
|
(JNIEnv *env, jclass clazz)
|
|
(JNIEnv *env, jclass clazz)
|
|
{
|
|
{
|
|
|
|
+#ifdef UNIX
|
|
Dl_info dl_info;
|
|
Dl_info dl_info;
|
|
int ret = dladdr(
|
|
int ret = dladdr(
|
|
Java_org_apache_hadoop_util_NativeCodeLoader_getLibraryName,
|
|
Java_org_apache_hadoop_util_NativeCodeLoader_getLibraryName,
|
|
&dl_info);
|
|
&dl_info);
|
|
return (*env)->NewStringUTF(env, ret==0 ? "Unavailable" : dl_info.dli_fname);
|
|
return (*env)->NewStringUTF(env, ret==0 ? "Unavailable" : dl_info.dli_fname);
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+#ifdef WINDOWS
|
|
|
|
+ SIZE_T ret = 0;
|
|
|
|
+ DWORD size = MAX_PATH;
|
|
|
|
+ LPWSTR filename = NULL;
|
|
|
|
+ HMODULE mod = NULL;
|
|
|
|
+ DWORD err = ERROR_SUCCESS;
|
|
|
|
+
|
|
|
|
+ MEMORY_BASIC_INFORMATION mbi;
|
|
|
|
+ ret = VirtualQuery(Java_org_apache_hadoop_util_NativeCodeLoader_getLibraryName,
|
|
|
|
+ &mbi, sizeof(mbi));
|
|
|
|
+ if (ret == 0) goto cleanup;
|
|
|
|
+ mod = mbi.AllocationBase;
|
|
|
|
+
|
|
|
|
+ do {
|
|
|
|
+ filename = (LPWSTR) realloc(filename, size * sizeof(WCHAR));
|
|
|
|
+ if (filename == NULL) goto cleanup;
|
|
|
|
+ GetModuleFileName(mod, filename, size);
|
|
|
|
+ size <<= 1;
|
|
|
|
+ err = GetLastError();
|
|
|
|
+ } while (err == ERROR_INSUFFICIENT_BUFFER);
|
|
|
|
+
|
|
|
|
+ if (err != ERROR_SUCCESS) goto cleanup;
|
|
|
|
+
|
|
|
|
+ return (*env)->NewString(env, filename, (jsize) wcslen(filename));
|
|
|
|
+
|
|
|
|
+cleanup:
|
|
|
|
+ if (filename != NULL) free(filename);
|
|
|
|
+ return (*env)->NewStringUTF(env, "Unavailable");
|
|
|
|
+#endif
|
|
}
|
|
}
|