JNI method from static lib in ios?

Grigory Ptashko grigory.ptashko at gmail.com
Thu Mar 24 12:40:54 UTC 2016


Thank you very much!

It helped!

I made it work :)

> On 24 марта 2016 г., at 15:32, Bob Vandette <bob.vandette at oracle.com> wrote:
> 
> Here’s an example for libzip.
> 
> #ifdef STATIC_BUILD
> JNIEXPORT jint JNICALL
> JNI_OnLoad_zip(JavaVM *vm, void *reserved)
> {
>    return JNI_VERSION_1_8;
> }
> #endif
> 
> 
> In JDK9, I added some macros to minimize the changes and ifdefs needed 
> throughout the JDK sources.  You could use something like that for your 
> application code.
> 
> Look for STATIC_BUILD in …
> 
> jdk9/jdk/src/java.base/share/native/libjava/jni_util.h
> 
> 
> Bob.
> 
> 
>> On Mar 24, 2016, at 8:11 AM, Grigory Ptashko <grigory.ptashko at gmail.com> wrote:
>> 
>> Yes, I’ve found out about JNI static libraries.
>> 
>> Can you, please, give me the simplest example from JDK9 sources
>> that implements JNI_OnLoad_<Lib> ? That would help me a lot..
>> 
>> Thank you.
>> 
>>> On 24 марта 2016 г., at 15:00, Bob Vandette <bob.vandette at oracle.com> wrote:
>>> 
>>> The JNI specification was updated in SE 8 to support static JNI libraries.
>>> 
>>> The key change is around the JNI_OnLoad function.  
>>> 
>>> In order for Java to know that a JNI static library is bound to the current executable, 
>>> you must have a unique JNI_OnLoad_{library} entry point that includes the name of the library.
>>> 
>>> Add a JNI_OnLoad_JavaToUIOasteboard entry point to your library when it’s built as a static
>>> library.  This will allow the ClassLoader to successfully register it as a JNI library when System.loadLibrary
>>> is called.  Take a look at the SE 8 JNI spec and the JDK9 JDK sources for other examples of these static library 
>>> entry points.
>>> 
>>> Bob.
>>> 
>>> 
>>>> On Mar 24, 2016, at 5:50 AM, Grigory Ptashko <grigory.ptashko at gmail.com> wrote:
>>>> 
>>>> Hello.
>>>> 
>>>> I'm able to launch jdk9 on ios both on the simulator and device.
>>>> And also I've managed to remote debug java running in the simulator.
>>>> 
>>>> I want to use the JNI method from my java class.
>>>> I made a static library libJavaToUIPasteboard.a.
>>>> 
>>>> I made it a fat library:
>>>> 
>>>> Here’s what lipo -info libJavaToUIPasteboard.a outputs:
>>>> 
>>>> Architectures in the fat file: libJavaToUIPasteboard.a are: armv7 i386 x86_64 arm64 
>>>> 
>>>> 
>>>> Here's what nm libJavaToUIPasteboard.a outputs:
>>>> 
>>>> 0000000000000000 T _Java_EvalJava_stringToUIPasteboard
>>>>              U _NSLog
>>>> 0000000000009b20 S _OBJC_CLASS_$_JavaToUIPasteboard
>>>>              U _OBJC_CLASS_$_NSObject
>>>> 0000000000009af8 S _OBJC_METACLASS_$_JavaToUIPasteboard
>>>>              U _OBJC_METACLASS_$_NSObject
>>>>              U ___CFConstantStringClassReference
>>>>              U __objc_empty_cache
>>>> 0000000000009ab0 s l_OBJC_CLASS_RO_$_JavaToUIPasteboard
>>>> 0000000000009a68 s l_OBJC_METACLASS_RO_$_JavaToUIPasteboard
>>>> 
>>>> Just copying this file to app wrapper folder and also specifying the
>>>> java.library.path gives java.lang.UnsatisfiedLinkError: no JavaToUIPasteboard in java.library.path.
>>>> I tried both System.loadLibrary("JavaToUIPasteboard") and System.loadLibrary("libJavaToUIPasteboard").
>>>> They both produce UnsatisfiedLinkError.
>>>> 
>>>> I'm a bit confused. How can I use this static lib from my class via JNI.
>>>> 
>>>> Thank you.
>>>> 
>>>> --
>>>> Best regards,
>>>> Grigory Ptashko
>>>> 
>>>> +7 (916) 1489766
>>>> grigory.ptashko at gmail.com
>>>> facebook.com/GrigoryPtashko
>>>> 
>>> 
>> 
>> 
>> --
>> Best regards,
>> Grigory Ptashko
>> 
>> +7 (916) 1489766
>> grigory.ptashko at gmail.com
>> facebook.com/GrigoryPtashko
>> 
> 


--
Best regards,
Grigory Ptashko

+7 (916) 1489766
grigory.ptashko at gmail.com
facebook.com/GrigoryPtashko



More information about the mobile-dev mailing list