On 28/03/2012 10:52, Michael McMahon wrote:
Maybe, we should be doing what Dan Daugherty suggested yesterday and
re-mapping the native
filename in the case where a full absolute path is passed in (which is
the code-path
when System.load() is called above)
My reasoning (for rejecting that) was that an absolute path is a
request for an explicit name
eg. System.load("/abs/path/libfoo.dylib") and it seems odd to go
modifying the path that
the user provided (as opposed to the System.loadLibrary("foo") case,
where we have to
construct the path internally). But, I hadn't considered the case
above where the path
is constructed by calling System.mapLibraryName().
So, I think a better approach might be to just to check for the old
".jnilib" suffix in all
the cases, rather than changing System.mapLibraryName(). Otherwise,
we'll have an inconsistency
forever more between the output of that method and the library suffix
that we want people
to use.
I've attached the jdk8 diffs for doing this.
- Michael
I checked Apple's JDK6 and it looks to me that they always favor .jnilib
over .dylib. If I compile some native code to two shared libraries, one
with the .dylib suffix and the other with .jnilib then with Apple's JDK6
it always seems to load the .jnilib version. If only the .dylib library
exists then it loads that. Also, as per a previous post, the
System.mapLibraryName method with Apple's JDK6 seems to favor .jnilib
too. This makes wonder about the original patches in the bsd-port and
macosx forest as the comments there suggest that ".jnilib" is legacy
when it seems to have been the favored suffix in JDK6 at least.
Anyway, for jdk7 & jdk8 it looks like we are making a break from the
past and supporting .jnilib is just to give developers a chance to
migrate. In that context Dan's suggestion and your latest patch seems
reasonable but does lead a few anomalies - for example
System.loadLibrary with an absolute path might succeed even though the
library will appear to not exist if tested separately. Also I wonder
about System.mapLibraryName where someone tests to see if the library
exists before then invoke System.loadLibrary. My guess is that there
isn't a perfect solution to this as there will always been anomalies in
a migration like this.
On the latest webrev then the use of final at L1867 is a bit odd and can
be removed. For the jdk8 version then the fromClass needs to be Class<?>.
-Alan