From dd201b2f14bff0a825ef47d61f111b228a1d207e Mon Sep 17 00:00:00 2001 From: Brian Matzon Date: Sat, 22 Mar 2003 23:17:11 +0000 Subject: [PATCH] fix: load OpenAL based on java.library.path --- src/java/org/lwjgl/openal/BaseAL.java | 35 ++++++++++++-- src/native/common/extal.c | 47 +++++++++++-------- src/native/common/extal.h | 2 +- src/native/common/org_lwjgl_openal_BaseAL.cpp | 4 +- src/native/common/org_lwjgl_openal_BaseAL.h | 2 +- 5 files changed, 63 insertions(+), 27 deletions(-) diff --git a/src/java/org/lwjgl/openal/BaseAL.java b/src/java/org/lwjgl/openal/BaseAL.java index ff25d5eb..2b1259bb 100644 --- a/src/java/org/lwjgl/openal/BaseAL.java +++ b/src/java/org/lwjgl/openal/BaseAL.java @@ -31,6 +31,9 @@ */ package org.lwjgl.openal; +import java.io.File; +import java.util.StringTokenizer; + /** * $Id$ * @@ -71,10 +74,34 @@ public abstract class BaseAL { */ public void create() throws Exception { if (created) { - return; - } + return; + } + + + // need to pass path of possible locations of OAL to native side + String libpath = System.getProperty("java.library.path"); + String seperator = System.getProperty("path.separator"); + String libname; + + // libname is hardcoded atm - this will change in a near future... + libname = (System.getProperty("os.name").toLowerCase().indexOf("windows") == -1) + ? "libopenal.so" + : "OpenAL32.dll"; + + StringTokenizer st = new StringTokenizer(libpath, seperator); - if (!nCreate()) { + //create needed string array + String[] oalPaths = new String[st.countTokens()+1]; + + //build paths + for(int i=0;iGetArrayLength(oalPaths); +#ifdef _DEBUG + printf("Found %d OpenAL paths\n", pathcount); +#endif #ifdef _WIN32 - jstring propertykey; - jstring librarypath; - jclass systemclass; - jmethodID propertymethod; - //compile bitch! - //propertykey = env->NewStringUTF("java.library.path"); - ///*systemclass = */env->FindClass("java/lang/System"); - //propertymethod = env->GetStaticMethodID(systemclass, "getProperty", "(Ljava/lang/String;)Ljava/lang/String"); - //librarypath = env->CallStaticObjectMethod(systemclass, jmethodID, propertykey); - printf("Loaded library path: %s", librarypath); - - //parse string - - //try to load for each path - handleOAL = LoadLibrary("OpenAL32.dll"); + for(int i=0;iGetObjectArrayElement(oalPaths, i); +#ifdef _DEBUG + printf("Testing '%s'\n", env->GetStringUTFChars(path, NULL)); +#endif + handleOAL = LoadLibrary(env->GetStringUTFChars(path, NULL)); + if (handleOAL != NULL) { +#ifdef _DEBUG + printf("Found OpenAL at '%s'\n", env->GetStringUTFChars(path, NULL)); +#endif + break; + } + } #endif #ifdef _X11 - handleOAL = dlopen("libopenal.so", RTLD_LAZY); + //handleOAL = dlopen("libopenal.so", RTLD_LAZY); + for(int i=0;iGetObjectArrayElement(oalPaths, i); + handleOAL = dlopen(env->GetStringUTFChars(path, NULL), RTLD_LAZY); + if (handleOAL != NULL) { + break; + } + } #endif } @@ -201,13 +210,13 @@ void UnLoadOpenAL() { /** * Initializes OpenAL by loading the library */ -int InitializeOpenAL(JNIEnv *env) { +int InitializeOpenAL(JNIEnv *env, jobjectArray oalPaths) { if(handleOAL != 0) { return JNI_TRUE; } //load our library - LoadOpenAL(env); + LoadOpenAL(env, oalPaths); // if we couldn't load the library, get out if(handleOAL == 0) { diff --git a/src/native/common/extal.h b/src/native/common/extal.h index 81a41f27..91e8f11a 100644 --- a/src/native/common/extal.h +++ b/src/native/common/extal.h @@ -135,7 +135,7 @@ DEFINE_GUID(DSPROPSETID_EAX20_BufferProperties, #define INITGUID #define OPENAL -int InitializeOpenAL(JNIEnv *env); +int InitializeOpenAL(JNIEnv *env, jobjectArray oalPaths); void DeInitializeOpenAL(); //alc diff --git a/src/native/common/org_lwjgl_openal_BaseAL.cpp b/src/native/common/org_lwjgl_openal_BaseAL.cpp index 760eadaf..b76581d4 100644 --- a/src/native/common/org_lwjgl_openal_BaseAL.cpp +++ b/src/native/common/org_lwjgl_openal_BaseAL.cpp @@ -40,8 +40,8 @@ * Method: nCreate * Signature: ()Z */ -JNIEXPORT jboolean JNICALL Java_org_lwjgl_openal_BaseAL_nCreate (JNIEnv *env, jobject obj) { - if(!InitializeOpenAL(env)) { +JNIEXPORT jboolean JNICALL Java_org_lwjgl_openal_BaseAL_nCreate (JNIEnv *env, jobject obj, jobjectArray oalPaths) { + if(!InitializeOpenAL(env, oalPaths)) { jclass cls = env->FindClass("org/lwjgl/openal/OpenALException"); env->ThrowNew(cls, "Unable to load function pointers to openal."); env->DeleteLocalRef(cls); diff --git a/src/native/common/org_lwjgl_openal_BaseAL.h b/src/native/common/org_lwjgl_openal_BaseAL.h index 1ff7860a..3b8cd15d 100644 --- a/src/native/common/org_lwjgl_openal_BaseAL.h +++ b/src/native/common/org_lwjgl_openal_BaseAL.h @@ -46,7 +46,7 @@ extern "C" { * Signature: ()Z */ JNIEXPORT jboolean JNICALL Java_org_lwjgl_openal_BaseAL_nCreate - (JNIEnv *, jobject); + (JNIEnv *, jobject, jobjectArray); /* * Class: org_lwjgl_openal_BaseAL