Bonjour Jean-Louis,

thank you /very /much for looking into this!

In this use case in which rexx (because of BSF.CLS) loads libBSF4ooRexx.dylib 
which then tries to
locate and loadlibjvm.dylib et.al. the following would apply:

  * rexx -e "call bsf.cls"
    rexx -e "call bsf.cls; say .bsf4rexx~display.version; say
    .java.lang.System~getProperty('java.library.path')"

      o rexx needs to be able to load libBSF4ooRexx.dylib

      o even if /opt/BSF4ooRexx existed rexx would not load anything from there 
as that location is
        unknown to it

      o so either DYLD_LIBRARY_PATH needs to be set and point to the directory
        wherelibBSF4ooRexx.dylib can be loaded from or place a symbolic link 
into
        /usr/local/lib/libBSF4ooRexx.dylib such that the system can find and 
load it

  * oncelibBSF4ooRexx.dylib got loaded successfully from rexx the 
initialization code ("prolog") of
    BSF.CLS will use it to see whether Java is already loaded and if not load 
libjvm.dylib ("Java")
    at that point in time

      o Since yesterday's version of libBSF4ooRexx.dylib ("BSF 641.20210719") 
MacOS uses these
        places to find and load Java (libjvm.dylib):

          + /opt/BSF4ooRexx/libjvm.dylib
              # comment: if you used the install script a symbolic link to the 
Java version that got
                used to install BSF4ooRexx will be created there, such that 
that version (as long as
                it did not get updated) can be found and used; one could delete 
this symbolic link
                to have the next searches for libjvm.dylib take place:

          + if JAVA_HOME is defined then the following two attempts get carried 
out (this got added
            this past weekend, a long standing intent)

              # ${JAVA_HOME}/lib/server/libjvm.dylib and if not found, then
              # ${JAVA_HOME}/jre/lib/server/libjvm.dylib
                  * comment: starting with Java 9 (and then adjusted 
accordingly for Java 8 LTS) the
                    directory layout of Java got changed such that these two 
locations may carry
                    libjvm.dylib, depending on the installed Java versions

          + /System/Library/Frameworks/JavaVM.framework/JavaVM
              # comment: this location (Apple only) stems from the days when 
Apple supplied its own
                Java which now seems to find the default installed Java

          + libjvm.dylib
              # comment: this causes the operating system lookup to be employed 
to locate libjvm.dylib

      o after loading Java eventually successfully from the Rexx side (which is 
the case in all of
        your test cases!), the next step is using a Java class that causes the 
Java BSF scripting
        support for Rexx to be initialized; in this process libBSF4ooRexx.dylib 
needs to be loadable
        by the Java side which uses java.library.path to search for libraries; 
if not found the
        error message "/[BSFManager.loadScriptingEngine()] unable to load 
language: rexx:
        java.lang.UnsatisfiedLinkError: no BSF4ooRexx in java.library.path/" 
gets issued; e.g. (from
        above)

            rexx -e "call bsf.cls; say .bsf4rexx~display.version; say
        .java.lang.System~getProperty('java.library.path')"

        will display the java.library.path in effect; since yesterday ("BSF 
641.20210719") the new
        default for Unix (including Apple) is defined to be (note the current 
directory as the last
        one to look up):

           /opt/BSF4ooRexx:/usr/lib:/usr/lib64:/usr/local/lib:/usr/local/lib64:.

        such that libBSF4ooRexx.dylib needs to be in one of these six locations
          + comment: it would be possible to set the value for 
java.library.path that gets used by
            defining an environment symbol named "BSF4Rexx_JavaStartupOptions" 
with the Java desired
            startup options (just enter "java" in a Terminal to see the 
standard startup options),
            in this case you would need to have also something like the 
following as sole entry or
            as part of it (a supplied definition for java.library.path will 
inhibit BSF4ooRexx to
            use its default):
            -Djava.library.path=the:paths:to:lookup:by:java

        If libBSF4ooRexx.dylib cannot be loaded by Java at this stage then the 
loading of the Rexx
        script engine will cause an exception with the error message that you 
experience:

So with this context the test cases behave as expected.

---

Ad JAVA_HOME: this environment variable is very common in the Java world. It 
allows to have many
different Java versions on the same computer (there are zip archives for Java 
which one merely can
unzip) and use different Java versions in different processes. Changing 
JAVA_HOME then allows one to
test an application on a different/specific Java version.

---

A hint ad using BSF4ooRexx in a non-installed use-case: if you change into the 
unzipped directory of
the BSF4ooRexx zip-archive, i.e. "bsf4oorexx/install" and

  * run "setupBSF.rex" in "bsf4oorexx/install", then the installation and 
companion scripts get
    created and a symbolic link to the system's libBSF4ooRexx.dylib (there may 
be different on
    different Linuxes) gets created in the unzipped "bsf4oorexx" directory; the 
created script
    "setEnvironment4BSF.sh" will allow you to temporarily set your session's 
environment to use this
    version of BSF4ooRexx, just source it and the appropriate CLASSPATH 
environment variable will be set

      o if you have OpenOffice or LibreOffice installed and want to use it for 
the AOO/LO Rexx
        sample and utility scripts (file extensions ".rxo", rexx script for 
OpenOffice), then run
        "setupOOo.rex" in "bsf4oorexx/install" which will also create a 
"setEnvironment4OOo.sh"
        which you can source (CLASSPATH gets changed to point to the AOO/LO jar 
files that allow to
        use AOO/LO via BSF4ooRexx)

  * if you then use PATH and DYLD_LIBRARY_PATH to point to the unzipped 
"bsf4oorexx" directory you
    should be able to run all ooRexx scripts of BSF4ooRexx in that session.

Again, many thanks for taking the time to test this version!

---rony


On 20.07.2021 11:36, Jean Louis Faucher wrote:
> Guten tag Rony
>
> I have the same error in the 3 test cases.
>
> Note:
> I don’t have a directory /opt/BSF4ooRex
> I don’t have an environment variable with value /opt/BSF4ooRex
>
>
> *1st test case*
> Nothing in DYLD_LIBRARY_PATH
> libBSF4ooRexx.dylib copied in oorexx5 lib
>
> rexx -e “call bfs.cls”
> [BSFManager.loadScriptingEngine()] unable to load language: rexx: 
> java.lang.UnsatisfiedLinkError:
> no BSF4ooRexx in java.library.path
>
> libBSF4ooRexx.dylib is correctly loaded from oorexx5 lib
> dlopen(libBSF4ooRexx.dylib, 0x00000001)
> dyld: loaded:
> /local/rexx/oorexx/build/official/main/trunk/macos/clang/release/64/delivery/lib/libBSF4ooRexx.dylib
>
> libjvm is not found
> dlopen(/opt/BSF4ooRexx/libjvm.dylib, 0x00000009)
>   dlopen() failed, error: 'dlopen(/opt/BSF4ooRexx/libjvm.dylib, 9): image not 
> found'
>
>
> *2nd test case*
> remove libBSF4ooRexx.dylib from oorexx5 lib
> Put my install directory of libBSF4ooRexx.dylib in DYLD_LIBRARY_PATH
> libjvm directory not put in DYLD_LIBRARY_PATH
>
> rexx -e “call bfs.cls”
> [BSFManager.loadScriptingEngine()] unable to load language: rexx: 
> java.lang.UnsatisfiedLinkError:
> no BSF4ooRexx in java.library.path
>
> libBSF4ooRexx.dylib is correctly loaded from my install directory
> dlopen(libBSF4ooRexx.dylib, 0x00000001)
> dyld: loaded:
> /local/rexx/bsf4oorexx/BSF4ooRexx_install_v641-20210719-beta/bsf4oorexx/install/64/libBSF4ooRexx.dylib
>
> libjvm is not found
> dlopen(/opt/BSF4ooRexx/libjvm.dylib, 0x00000009)
>   dlopen() failed, error: 'dlopen(/opt/BSF4ooRexx/libjvm.dylib, 9): image not 
> found'
>
>
> *3rd test case*
> Add libjvm directory in DYLD_LIBRARY_PATH
>
> rexx -e “call bfs.cls”
> [BSFManager.loadScriptingEngine()] unable to load language: rexx: 
> java.lang.UnsatisfiedLinkError:
> no BSF4ooRexx in java.library.path
>
> libBSF4ooRexx.dylib is correctly loaded from my install directory
> dlopen(libBSF4ooRexx.dylib, 0x00000001)
> dyld: loaded:
> /local/rexx/bsf4oorexx/BSF4ooRexx_install_v641-20210719-beta/bsf4oorexx/install/64/libBSF4ooRexx.dylib
>
> libjvm is loaded (despite the path passed to dlopen)
> dlopen
> x/libjvm.dylib, 0x00000009)
> dyld: loaded:
> /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/lib/server/libjvm.dylib
>
>
>> On 19 Jul 2021, at 18:01, Rony G. Flatscher <rony.flatsc...@wu.ac.at
>> <mailto:rony.flatsc...@wu.ac.at>> wrote:
>>
>> Bonsoir Jean-Louis,
>>
>> today I finished up a new version of BSF4ooRexx that should work in this 
>> use-case. You can get it
>> from
>> <https://sourceforge.net/projects/bsf4oorexx/files/beta/20200928/BSF4ooRexx_install_v641-20210719-beta.zip/download>.
>> (This version got tested against MacOS, Linux and Windows.)
>>
>> If you test this version in your environment then please let me know of any 
>> difficulties or
>> problems that you encounter. (This version of BSF4ooRexx is still supposed 
>> to be usable against
>> ooRexx 4.1 and higher, however 5.0 is *strongly* advised due to its stable 
>> multithreadingness.
>> For that reason some JavaFX samples will deny being run on ooRexx prior to 
>> 5.0. This is another
>> reason for me to ask for a release version of ooRexx 5.0 beta *as is*, as it 
>> is much stabler,
>> faster and powerful than any earlier version of ooRexx.)
>>
>> ---rony
>>
>>
>> On 18.07.2021 00:02, Jean Louis Faucher wrote:
>>> Gute nacht Rony
>>>
>>> I have an atypical configuration where I use DYLD_LIBRARY_PATH to locate 
>>> the BSF4OORexx library.
>>> This is because I don’t “install” BSF4OORexx, I just unzip the delivery, 
>>> copy and rename the
>>> libraries to bsf4oorex/install/64
>>> With this configuration, your test cases are working (not saying this is 
>>> the solution).
>>>
>>>
>>> If I don’t set DYLD_LIBRARY_PATH, I get the same error than yours.
>>>
>>> I compared the output of the next command in both cases
>>> DYLD_PRINT_LIBRARIES="1" DYLD_PRINT_APIS="1" rexx -e "call bsf.cls”
>>>
>>> In the working session:
>>> dlopen(librexxapi.dylib, 0x00000001)
>>>   dlopen(librexxapi.dylib) ==> 0x10936da50
>>> dlopen(libBSF4ooRexx.dylib, 0x00000001)
>>> dyld: loaded:
>>> /local/rexx/bsf4oorexx/BSF4ooRexx_install_v641-20210715-beta/bsf4oorexx/install/64/libBSF4ooRexx.dylib
>>> dyld: loaded:
>>> /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/lib/server/libjvm.dylib
>>> dyld: loaded: /usr/lib/libstdc++.6.0.9.dylib
>>>
>>> In the not working session:
>>> dlopen(librexxapi.dylib, 0x00000001)
>>>   dlopen(librexxapi.dylib) ==> 0x10dd4a990
>>> dlopen(libBSF4ooRexx.dylib, 0x00000001)
>>>   dlopen() failed, error: 'dlopen(libBSF4ooRexx.dylib, 1): image not found'
>>> dlopen(/usr/lib/libBSF4ooRexx.dylib, 0x00000001)
>>>   dlopen() failed, error: 'dlopen(/usr/lib/libBSF4ooRexx.dylib, 1): image 
>>> not found'
>>>    919 *-* ::routine xBSF                   PUBLIC   EXTERNAL "LIBRARY 
>>> BSF4ooRexx BSF          
>>>       "
>>>      1 *-* call bsf.cls
>>> Error 98 running 
>>> /local/rexx/bsf4oorexx/BSF4ooRexx_install_v641-20210715-beta/bsf4oorexx/BSF.CLS
>>> line 919:  Execution error.
>>> Error 98.903:  Unable to load library "BSF4ooRexx".
>>>
>>> I find "/usr/lib” in one file:
>>> SysLibrary.cpp
>>>
>>>     // try loading directly
>>>     libraryHandle = dlopen(nameBuffer, RTLD_LAZY);
>>>     // if not found, then try from /usr/lib
>>>     if (libraryHandle == NULL)
>>>     {
>>>         sprintf(nameBuffer, "/usr/lib/lib%s%s", name, 
>>> ORX_SHARED_LIBRARY_EXT);
>>>         libraryHandle = dlopen(nameBuffer, RTLD_LAZY);
>>>
>>> The part to investigate is how to make the first dlopen work without using 
>>> DYLD_LIBRARY_PATH:
>>> If I put libBSF4ooRexx.dylib in the lib folder of oorexx then it works 
>>> (RPATH).
>>> If I put libBSF4ooRexx.dylib in the current directory then it works (see 
>>> man dlopen).
>>> I don’t know if other solutions are possible for the first dlopen
>>>
>>> The other solution could to add “/usr/local/lib” as 2nd fallback.
>>> But that brings the question of order.
>>> Maybe a more general solution would be to use an environment variable like 
>>> REXX_LIBRARY_PATH.
>>> We have already REXX_PATH for locating the rexx files.
>>>
>>>
>>> Jean-Louis
>>>
>>>> On 17 Jul 2021, at 21:56, Rony G. Flatscher <rony.flatsc...@wu.ac.at
>>>> <mailto:rony.flatsc...@wu.ac.at>> wrote:
>>>>
>>>> On MacOSX the BSF4ooRexx library is named "libBSF4ooRexx.dylib".
>>>>
>>>> Testing the changes in the BSF4ooRexx installation scripts and then 
>>>> testing the resulting
>>>> installations surfaced a problem on MacOSX: libBSF4ooRexx.dylib can be 
>>>> loaded via Java and used
>>>> successfully.
>>>>
>>>> However, loading "libBSF4ooRexx.dylib" via ooRexx is not successful. To be 
>>>> precise, the
>>>>
>>>>     ::routine xbsf PUBLIC EXTERNAL "LIBRARY BSF4ooRexx BSF"
>>>>
>>>> fails with the execution error:
>>>>
>>>>     Error 98.903: Unable to load library "BSF4ooRexx".
>>>>
>>>> Here two rexxtry.rex sessions, the first one is run with "rexxj.sh 
>>>> /usr/local/bin/rexxtry.rex"
>>>> which loads a Java program that will load the BSF4ooRexx library to then 
>>>> execute
>>>> /usr/local/bin/rexxtry.rex. This is followed by a "rexx rexxtry.rex" 
>>>> session which yields the
>>>> exection error. This is then followed by the "rexx -e" statement which 
>>>> does a call BSF.CLS
>>>> which then shows the full error message:
>>>>
>>>>     rony@ronymac2014 ~ % rexxj.sh /usr/local/bin/rexxtry.rex 
>>>> REXX-ooRexx_5.0.0(MT)_64-bit 6.05
>>>>     12 Jul 2021 rexxtry.rex lets you interactively try REXX statements. 
>>>> Each string is executed
>>>>     when you hit Enter. Enter 'call tell' for a description of the 
>>>> features. Go on - try a
>>>>     few... Enter 'exit' to end. call bsf.cls 
>>>> ..............................................
>>>>     rexxtry.rex on DARWIN say .bsf4rexx~display.version ooRexx 5.0.0 
>>>> r12280 (12 Jul 2021) / BSF
>>>>     641.20210715 / Java 1.8.0_162, 64-bit / Darwin 20.5.0
>>>>     .............................................. rexxtry.rex on DARWIN 
>>>> exit
>>>>     rony@ronymac2014 ~ % rexxtry.rex REXX-ooRexx_5.0.0(MT)_64-bit 6.05 12 
>>>> Jul 2021 rexxtry.rex
>>>>     lets you interactively try REXX statements. Each string is executed 
>>>> when you hit Enter.
>>>>     Enter 'call tell' for a description of the features. Go on - try a 
>>>> few... Enter 'exit' to
>>>>     end. call bsf.cls Oooops ! ... try again. Execution error. Unable to 
>>>> load library
>>>>     "BSF4ooRexx". rc = 98.903 .................................. 
>>>> rexxtry.rex on DARWIN exit
>>>>     *rony@ronymac2014 ~ % rexx -e "call bsf.cls"****919 *-* ::routine xBSF 
>>>> PUBLIC EXTERNAL
>>>>     "LIBRARY BSF4ooRexx BSF "****1 *-* call bsf.cls****Error 98 running 
>>>> /usr/local/bin/BSF.CLS
>>>>     line 919: Execution error.****Error 98.903: Unable to load library 
>>>> "BSF4ooRexx".*
>>>>     rony@ronymac2014 ~ % 
>>>>
>>>> It is the first of five external "LIBRARY BSF4ooRexx XXX" directives 
>>>> (these five external
>>>> function names are: "BSF", "BsfCreateRexxProxy", "BsfRexxProxy", 
>>>> "BsfUninit4JavaBean",
>>>> "BsfLoadJava"). So it is the first time the "BSF4ooRexx" library needs to 
>>>> be proecessed by
>>>> ooRexx in this way.
>>>>
>>>> This was tested against the Sourceforge version of ooRexx r12280, July 12 
>>>> 2021.
>>>>
>>>> Is there anything I could do to help pinpoint the problem?
>>>>
>>>> ---
>>>>
_______________________________________________
Oorexx-devel mailing list
Oorexx-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/oorexx-devel

Reply via email to