Re: Apple is deprecating Java
"Arne Vajh?j" <arne@vajhoej.dk> wrote in message
news:4cc488f3$0$23752$14726298@news.sunsite.dk...
On 24-10-2010 15:15, BGB / cr88192 wrote:
"Arne Vajh?j"<arne@vajhoej.dk> wrote in message
news:4cc38955$0$23765$14726298@news.sunsite.dk...
On 23-10-2010 01:23, BGB / cr88192 wrote:
"Arne Vajh?j"<arne@vajhoej.dk> wrote in message
news:4cc2160b$0$23763$14726298@news.sunsite.dk...
On 22-10-2010 03:48, BGB / cr88192 wrote:
JNI and JNA leave a bit to be desired...
having to use pre-existing classes or interfaces to interface Java
with
anything else is... lame...
these are not unfixable problems, but thus far the major VM's have
not
done
much to improve on them.
even CNI (like GCJ) would be an improvement (just better would be not
having
to use GCJ to use it...).
admittedly, this front is a little awkward...
but, I am left to wonder sometimes if the poor interface mechanisms
are
maybe deliberate...
It has certainly had the effect that the usage of JNI is rare.
yes.
Sun devises nearly the worst possible way to interface between C and
Java
and standardizes on it as a covert attempt to prevent people from
plugging
together C and Java code except in case of dire emergency...
I don't think SUN sees it as a problem.
And many Java developers neither.
We don't need this:
http://www.mono-project.com/MoMA
:-)
JNI is kind of lame when dealing with a largish mixed language codebase
Absolutely.
this is back to the whole "vision" thing.
Java was seen as a framework for creating and distributing
architecture-neutral apps...
to this extent, it works well enough...
Yes.
however:
totally left out of the mix is people who are mostly building C and C++
apps,
Yes.
I suspect probably Sun didn't really want people writing mixed apps, and
using Java as a scripting language, since this would hinder its use in
the
above category (as an app-distribution platform).
Yes.
JNI seems to be designed in such a way to make this particular usage
pattern
somewhat awkward (one has to use the JNIEnv pointers which are not
gueranteed to be valid if saved between calls, ...), and AFAIK there is
no
external C-side API, ...
What is "external C-side API"?
JNI certainly contains API for C->Java.
basically, where one just includes against the headers and links against the
correct DLL or whatever representing the VM's external interface, and just
starts making direct API calls to control the VM (in the same way as say
POSIX or the Win32 GDI or similar, or when using basic features of OpenGL,
or most other C libraries apart from DirectX and similar...).
instead, one has to deal with everything via the JNIEnv and JavaVM and
jvmtiEnv structures and similar.
for example, if one could do things more like, say:
#include <javavm.h>
int main(int argc, char *argv[])
{
JVMContext *ctx;
int i;
jvmInit(argc, argv);
ctx=jvmCreateContext();
jvmMakeCurrent(ctx);
...
jvmAddClassPath("%USERPROFILE%/Application Data/MyApp/bin");
jvmLoadLibrary("myclasses.jar");
i=jvmInvokeStaticI("myapp/MyClass/myMethod(I)I", 3);
...
jvmDeinit();
}
or similar...
probably, I guess, one could wrap JNI and JVMTI and similar to beat together
something like this if they really wanted, but oh well...
I made a partial wrapper before (implemented mostly via static inline
functions), but didn't end up using it so much, hmm...
clz=jniFindClass(env, "myapp/MyClass");
is not too much different from:
clz=(*env)->FindClass(env, "myapp/MyClass");
in my VM, the prior example was closer to how things may be done (although
the "init" function ends up doing main-hijacking and recalling back into the
function given technical issues WRT the GC).
from a VM-test stub:
<--
#include <bgbjvm.h>
int main_argc;
char **main_argv;
int main_i()
{
void *args[16];
printf("Mark 0\n");
BJVM_Init(); //bring up VM
printf("Mark 1\n");
// *(int *)-1=-1; //usual trick to do a controlled crash
BJVM_GetLoadedClass("HelloTest"); //load the test
BJVM_GetLoadedClass("java/lang/System"); //load the class early
//note: BJVM_Init(); implicitly loads "java/lang/String" by itself
//it also pulls in the class library/... (currently hard-coded)
printf("Mark 2\n");
args[0]=NULL;
BJVM_InvokeStaticMethodU(
"HelloTest", "main", "(QLjava/lang/String;)v", args);
//above: call method: note, my VM internally uses different signature
notation from the JVM
//main JNI interface fakes proper JVM sigs though...
}
int main(int argc, char *argv[])
{
main_argc=argc;
main_argv=argv;
dy_init2(main_i); //GC related, brings up VM core facilities as well
}
-->
although in some cases I end up using a lot of interface structs as well as
a way of interfacing with the VM without hard-linking against the DLL, and I
actually provide 2 different implementations of JNI, which differ mostly in
terms of which DLL exports the interface and how much effort was put into
faking the JVM's behavior.
some amount of my library code just uses JNI though, rather than
sidestepping it and relying on the underlying implementation details.
JNI is not ideal, but as noted elsewhere, it does work.
but... not everyone wants or needs such a "platform".
True.
Arne