diff --git a/java/jni/elf-loader.cc b/java/jni/elf-loader.cc new file mode 100644 index 0000000000000000000000000000000000000000..dea6e2084134a144a2e60106010be448e0f234e7 --- /dev/null +++ b/java/jni/elf-loader.cc @@ -0,0 +1,39 @@ +#include <algorithm> +#include "elf.hh" +#include <jni.h> +#include <string.h> + +extern elf::program* prog; + +const int argc_max_arguments = 256; + +bool run_elf(int argc, char** argv, int *return_code) +{ + if ((argc <= 0) || (argc > argc_max_arguments)) { + return (false); + } + + auto obj = prog->add_object(argv[0]); + if (!obj) { + return (false); + } + + auto main = obj->lookup<int (int, char**)>("main"); + if (!main) { + return (false); + } + + /* call main in a thread */ + int rc = main(argc, argv); + + /* cleanups */ + prog->remove_object(argv[0]); + + /* set the return code */ + if (return_code) { + *return_code = rc; + } + + return (true); +} +