05ce767751c80d6afd1202281c57977e422e3cda
[nativez] / src / notzed.nativez / jni / nativez-linux.c
1 /*
2  * Copyright (C) 2019 Michael Zucchi
3  *
4  * This file is part of nativez <https://www.zedzone.space/software/nativez.html>
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions are
8  * met:
9  *
10  *     (1) Redistributions of source code must retain the above copyright
11  *     notice, this list of conditions and the following disclaimer. 
12  *
13  *     (2) Redistributions in binary form must reproduce the above copyright
14  *     notice, this list of conditions and the following disclaimer in
15  *     the documentation and/or other materials provided with the
16  *     distribution.  
17  *     
18  *     (3)The name of the author may not be used to
19  *     endorse or promote products derived from this software without
20  *     specific prior written permission.
21  * 
22  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
24  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
25  * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
26  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
27  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
28  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
30  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
31  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32  * POSSIBILITY OF SUCH DAMAGE. 
33  * 
34  */
35
36 #include <dlfcn.h>
37
38 #include "nativez.h"
39
40 int nativez_ResolveLibraries(JNIEnv *env, const NZLibTable *table) {
41         char name[64];
42         
43         for (int i=0;table[i].ptr;i++) {
44                 void *lib;
45                 
46                 sprintf(name, "lib%s.so", table[i].name);
47                 
48                 lib = dlopen(name, RTLD_LAZY | RTLD_GLOBAL);
49                 if (!lib) {
50                         fprintf(stderr, "Unable to open library `%s'\n", name);
51                         perror("dlopen");
52                         fflush(stderr);
53                         return -1;
54                 }
55
56                 *(table[i].ptr) = lib;
57         }
58         return 0;
59 }
60
61 int nativez_ResolveFunctions(JNIEnv *env, const NZFuncTable * const table) {
62         void *lib = NULL;
63         for (int i=0;table[i].ptr;i++) {
64                 if (table[i].name) {
65                         void *entry = dlsym(lib, table[i].name);
66
67                         *(table[i].ptr) = entry;
68                         if (!entry) {
69                                 fprintf(stderr, "Unable to resolve `%s'\n", table[i].name);
70                                 fflush(stderr);
71                         }
72                 } else {
73                         lib = *(table[i].ptr);
74                 }
75         }
76
77         return 0;
78 }