source: trunk/source/examples/jni.lisp @ 11381

Last change on this file since 11381 was 11381, checked in by gb, 11 years ago

Use 'jni-init' import to call JNI functions that clobber Mach exception
ports on Darwin.
(This still needs lots of work ...)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 1.9 KB
Line 
1(eval-when (:compile-toplevel :execute)
2  (use-interface-dir :java))
3
4(eval-when (:compile-toplevel :load-toplevel :execute)
5  (open-shared-library "/System/Library/Frameworks/JavaVM.framework/JavaVM"))
6
7(defun %init-java-vm (&rest args)
8  (declare (dynamic-extent args))
9  (let* ((nargs (length args)))
10    (rlet ((initargs :<J>ava<VMI>nit<A>rgs)
11           (env (* :<JNIE>nv))
12           (vm (* :<J>ava<VM>)))
13      (%stack-block ((options (* nargs (record-length :<J>ava<VMO>ption))))
14        (do* ((i 0 (1+ i))
15              (args args (cdr args))
16              (p options (%inc-ptr p (record-length :<J>ava<VMO>ption))))
17             ((= i nargs))
18          (setf (pref p :<J>ava<VMO>ption.option<S>tring)
19                (car args)))
20        (setf (pref initargs :<J>ava<VMI>nit<A>rgs.version) #$JNI_VERSION_1_2
21              (pref initargs :<J>ava<VMI>nit<A>rgs.n<O>ptions) nargs
22              (pref initargs :<J>ava<VMI>nit<A>rgs.options) options
23              (pref initargs :<J>ava<VMI>nit<A>rgs.ignore<U>nrecognized) #$JNI_TRUE)
24        (let* ((result
25                (ff-call (%kernel-import target::kernel-import-jvm-init)
26                         :address (foreign-symbol-address "JNI_CreateJavaVM")
27                         :address vm
28                         :address env
29                         :address initargs
30                         :int)))
31          (if (>= result 0)
32            (values (%get-ptr vm) (%get-ptr env))
33            (error "Can't create Java VM: result = ~d" result)))))))
34
35; (%init-java-vm)
36
37(defun %attach-to-jvm (jvm)
38  (rlet ((envp :address +null-ptr+))
39    (let* ((result (ff-call (%kernel-import target::kernel-import-jvm-init)
40                            :address (pref jvm #>JavaVM.AttachCurrentThread)
41                            :address jvm
42                            :address envp
43                            :address +null-ptr+
44                            :int))
45           (env (pref envp :address)))
46      (if (eql 0 result)
47        env))))
48           
49             
Note: See TracBrowser for help on using the repository browser.