[
  {
    "path": ".clang-format",
    "content": "# Google C/C++ Code Style settings\r\n# https://clang.llvm.org/docs/ClangFormatStyleOptions.html\r\n# Author: Kehan Xue, kehan.xue (at) gmail.com\r\n\r\nLanguage: Cpp\r\nBasedOnStyle: Google\r\nAccessModifierOffset: -1\r\nAlignAfterOpenBracket: Align\r\nAlignConsecutiveAssignments: None\r\nAlignOperands: Align\r\nAllowAllArgumentsOnNextLine: true\r\nAllowAllConstructorInitializersOnNextLine: true\r\nAllowAllParametersOfDeclarationOnNextLine: false\r\nAllowShortBlocksOnASingleLine: Empty\r\nAllowShortCaseLabelsOnASingleLine: false\r\nAllowShortFunctionsOnASingleLine: Inline\r\nAllowShortIfStatementsOnASingleLine: Never  # To avoid conflict, set this \"Never\" and each \"if statement\" should include brace when coding\r\nAllowShortLambdasOnASingleLine: Inline\r\nAllowShortLoopsOnASingleLine: false\r\nAlwaysBreakAfterReturnType: None\r\nAlwaysBreakTemplateDeclarations: Yes\r\nBinPackArguments: true\r\nBreakBeforeBraces: Custom\r\nBraceWrapping:\r\n  AfterCaseLabel: false\r\n  AfterClass: false\r\n  AfterStruct: false\r\n  AfterControlStatement: Never\r\n  AfterEnum: false\r\n  AfterFunction: false\r\n  AfterNamespace: false\r\n  AfterUnion: false\r\n  AfterExternBlock: false\r\n  BeforeCatch: false\r\n  BeforeElse: false\r\n  BeforeLambdaBody: false\r\n  IndentBraces: false\r\n  SplitEmptyFunction: false\r\n  SplitEmptyRecord: false\r\n  SplitEmptyNamespace: false\r\nBreakBeforeBinaryOperators: None\r\nBreakBeforeTernaryOperators: true\r\nBreakConstructorInitializers: BeforeColon\r\nBreakInheritanceList: BeforeColon\r\nColumnLimit: 80\r\nCompactNamespaces: false\r\nContinuationIndentWidth: 4\r\nCpp11BracedListStyle: true\r\nDerivePointerAlignment: false  # Make sure the * or & align on the left\r\nEmptyLineBeforeAccessModifier: LogicalBlock\r\nFixNamespaceComments: true\r\nIncludeBlocks: Preserve\r\nIndentCaseLabels: true\r\nIndentPPDirectives: None\r\nIndentWidth: 2\r\nKeepEmptyLinesAtTheStartOfBlocks: true\r\nMaxEmptyLinesToKeep: 1\r\nNamespaceIndentation: None\r\nObjCSpaceAfterProperty: false\r\nObjCSpaceBeforeProtocolList: true\r\nPointerAlignment: Left\r\nReflowComments: false\r\n# SeparateDefinitionBlocks: Always   # Only support since clang-format 14\r\nSpaceAfterCStyleCast: false\r\nSpaceAfterLogicalNot: false\r\nSpaceAfterTemplateKeyword: true\r\nSpaceBeforeAssignmentOperators: true\r\nSpaceBeforeCpp11BracedList: false\r\nSpaceBeforeCtorInitializerColon: true\r\nSpaceBeforeInheritanceColon: true\r\nSpaceBeforeParens: ControlStatements\r\nSpaceBeforeRangeBasedForLoopColon: true\r\nSpaceBeforeSquareBrackets: false\r\nSpaceInEmptyParentheses: false\r\nSpacesBeforeTrailingComments: 2\r\nSpacesInAngles: false\r\nSpacesInCStyleCastParentheses: false\r\nSpacesInContainerLiterals: false\r\nSpacesInParentheses: false\r\nSpacesInSquareBrackets: false\r\nStandard: c++11\r\nTabWidth: 4\r\nUseTab: Never"
  },
  {
    "path": ".github/workflows/build.yml",
    "content": "on:\r\n  - push\r\njobs:\r\n  build:\r\n    runs-on: ubuntu-latest\r\n    steps:\r\n    - name: Checkout repository\r\n      uses: actions/checkout@v4\r\n    - name: Install MinGW x86-64 compiler\r\n      run: sudo apt install -y g++-mingw-w64-x86-64\r\n    - name: Install JDK\r\n      run: sudo apt install -y openjdk-8-jdk\r\n    - name: Check if input.jar exists\r\n      id: check_input_jar\r\n      uses: andstor/file-existence-action@v2\r\n      with:\r\n        files: input.jar\r\n    - name: Copy test if input.jar does not exist\r\n      if: steps.check_input_jar.outputs.files_exists == 'false'\r\n      run: |\r\n        echo \"::warning file=input.jar::No input.jar presented, so using input.jar.test\"\r\n        cp input.jar.test input.jar\r\n    - name: Build\r\n      run: make build\r\n    - name: Upload output.dll as artifact\r\n      uses: actions/upload-artifact@v4\r\n      with:\r\n        name: output-x64.dll\r\n        path: output.dll\r\n        if-no-files-found: error"
  },
  {
    "path": ".gitignore",
    "content": "input.jar\r\noutput.dll\r\n*.class\r\nnative-src/classes/*\r\n!native-src/classes/.gitkeep\r\n.idea/\r\n.vscode/"
  },
  {
    "path": "Makefile",
    "content": "all: build\r\n\r\nbuild-injector:\r\n\t@echo \"Building injector class\"\r\n\t@javac -source 1.8 -target 1.8 injector-src/*.java\r\nbuild-header-converter:\r\n\t@echo \"Building class to header converter\"\r\n\t@javac -source 1.8 -target 1.8 header-converter-src/HeaderConverter.java\r\nconvert-injector: build-injector build-header-converter\r\n\t@echo \"Converting injector class to .h\"\r\n\t@java -cp header-converter-src HeaderConverter injector injector-src/*.class native-src/classes/injector.h\r\nconvert-jar: build-header-converter\r\n\t@echo \"Converting input jar to .h\"\r\n\t@java -cp header-converter-src HeaderConverter input-jar input.jar native-src/classes/jar.h\r\n\r\nnative_files := main.cpp injector.cpp utils.cpp\r\n\r\nbuild-library: convert-injector convert-jar\r\n\t@echo \"Building output dll\"\r\n\t@cd native-src && x86_64-w64-mingw32-g++ -O2 $(native_files) -shared -Wl,--dll -Wl,--exclude-all-symbols -static \\\r\n\t\t -static-libgcc -static-libstdc++ -luser32 -o ../output.dll\r\n\r\nbuild: clean build-library\r\n\t@echo \"Ready!\"\r\n\r\nclean-injector:\r\n\t@echo \"Cleaning injector classes\"\r\n\t@rm -f injector-src/*.class\r\nclean-header-converter:\r\n\t@echo \"Cleaning class to header converter classes\"\r\n\t@rm -f header-converter-src/*.class\r\nclean-headers:\r\n\t@echo \"Cleaning converted injector and input jar\"\r\n\t@rm -f native-src/classes/injector.h\r\n\t@rm -f native-src/classes/jar.h\r\nclean-output-library:\r\n\t@echo \"Cleaning output dll\"\r\n\t@rm -f output.dll\r\nclean: clean-injector clean-header-converter clean-headers clean-output-library\r\n\t@echo \"Cleaning everything\"\r\n"
  },
  {
    "path": "README.md",
    "content": "# jar-to-dll\r\n\r\nA simple tool that allows you to pack your mod .jar file to .dll and inject it into running Minecraft\r\n\r\n## Simple tutorial\r\n\r\n[English](/for-dummies/FOR_DUMMIES_EN.md) | [На русском](/for-dummies/FOR_DUMMIES_RU.md)\r\n\r\n## Usage\r\n\r\nFor building this I personally recommend using WSL on Windows or Linux\r\n\r\nTo build, you need these packages installed:\r\n\r\n- `g++-mingw-w64-x86-64`\r\n- Some kind of JDK (I prefer using [Adoptium Temurin](https://adoptium.net/temurin/releases/), all install instructions are available on their website)\r\n\r\nThen, you need to drop your mod .jar as `input.jar` into the root directory of repo\r\n\r\nAnd as a last step - just build it:\r\n```shell\r\nmake build\r\n```\r\n\r\nAs a result you'll get `output.dll` which you can inject\r\n\r\n## Supported versions and features\r\n\r\n- Only Forge mods are supported, by now\r\n- Only mods that do not require usage of URLClassLoader to do something dynamically\r\n- Your mod should do all stuff inside no-args constructor in class that is marked with `@Mod` annotation\r\n- Tested on 1.7.10, 1.8.8, 1.12.2, 1.16.5\r\n\r\n"
  },
  {
    "path": "for-dummies/FOR_DUMMIES_EN.md",
    "content": "# Manual for dummies\r\n\r\nThis manual is for people who don't want to waste their time trying to install all stuff that is required\r\n\r\n## Steps\r\n\r\n### Register account on GitHub\r\n\r\nYour account will be required to build all stuff that you'll need\r\n\r\n### Create private repository\r\n\r\nCreate repository that will be required to run GitHub Actions on it\r\n\r\n![create-repo-1](images/create-repo-1.png)\r\n\r\nSpecify the name of repository and mark it private, if you don't want to make your .jar and .dll public\r\n\r\n![create-repo-2](images/create-repo-2.png)\r\n\r\n### Import code from this repository\r\n\r\nClick `Import` to import\r\n\r\n![import-1](images/import-1.png)\r\n\r\nSpecify this repository URL, e.g. `https://github.com/radioegor146/jar-to-dll`\r\n\r\n![import-2](images/import-2.png)\r\n\r\nWait for import to complete \r\n\r\n![import-3](images/import-3.png)\r\n\r\nAfter completion go to your repository\r\n\r\n![import-4](images/import-4.png)\r\n\r\n### Allow GitHub Actions\r\n\r\nNavigate to `Settings` tab\r\n\r\n![allow-gh-actions-1](images/allow-gh-actions-1.png)\r\n\r\nOpen `Actions` menu\r\n\r\n![allow-gh-actions-2](images/allow-gh-actions-2.png)\r\n\r\nClick on `General`\r\n\r\n![allow-gh-actions-3](images/allow-gh-actions-3.png)\r\n\r\nAllow all actions to be run\r\n\r\n![allow-gh-actions-4](images/allow-gh-actions-4.png)\r\n\r\n### Enable GitHub Actions\r\n\r\nNavigate to `Actions` tab\r\n\r\n![enable-gh-actions-1](images/enable-gh-actions-1.png)\r\n\r\nClick `Enable Actions on this repository` to enable actions\r\n\r\n![enable-gh-actions-2](images/enable-gh-actions-2.png)\r\n\r\n### Upload your .jar file and build .dll\r\n\r\nNavigate to `Code` tab\r\n\r\n![upload-1](images/upload-1.png)\r\n\r\nOpen `Add file` menu\r\n\r\n![upload-2](images/upload-2.png)\r\n\r\nClick `Upload files` to upload your .jar file\r\n\r\n![upload-3](images/upload-3.png)\r\n\r\nRename your .jar file on your computer to `input.jar` (IMPORTANT!) and drag-and-drop it here\r\n\r\n![upload-4](images/upload-4.png)\r\n\r\nEnsure that it is uploaded and click `Commit changes`\r\n\r\n![upload-5](images/upload-5.png)\r\n\r\nHow that the file is uploaded, navigate to `Actions` tab\r\n\r\n![upload-6](images/upload-6.png)\r\n\r\nHere, click on the running workflow\r\n\r\n![upload-7](images/upload-7.png)\r\n\r\nWait for action to complete\r\n\r\n![upload-8](images/upload-8.png)\r\n\r\nRefresh page and verify that there are no warnings. Now you can download you .dll file and use it as you want!\r\n\r\n![upload-9](images/upload-9.png)"
  },
  {
    "path": "for-dummies/FOR_DUMMIES_RU.md",
    "content": "# Туториал для неискушенных\r\n\r\nЭтот туториал предназначен в первую очередь для тех, кому лень разбираться с установкой всего, что нужно\r\n\r\n## Шаги\r\n\r\n### Зарегестрируйте свой аккаунт на GitHub\r\n\r\nВаша учетная запись потребуется для сборки всего, что вам будет нужно\r\n\r\n### Создать приватный репозиторий\r\n\r\nСоздайте репозиторий, который потребуется для запуска GitHub Actions\r\n\r\n![create-repo-1](images/create-repo-1.png)\r\n\r\nУкажите имя репозитория и пометьте его как закрытый, если вы не хотите делать ваши .jar-файлы и .dll общедоступными\r\n\r\n![create-repo-2](images/create-repo-2.png)\r\n\r\n### Импортируйте код из этого репозитория\r\n\r\nНажмите `Import` для импорта\r\n\r\n![import-1](images/import-1.png)\r\n\r\nУкажите URL этого репозитория, т.е. `https://github.com/radioegor146/jar-to-dll`\r\n\r\n![import-2](images/import-2.png)\r\n\r\nДождитесь завершения импорта\r\n\r\n![import-3](images/import-3.png)\r\n\r\nПосле завершения перейдите в свой репозиторий\r\n\r\n![import-4](images/import-4.png)\r\n\r\n### Разрешите GitHub Actions\r\n\r\nПереместитесь на вкладку `Settings`\r\n\r\n![allow-gh-actions-1](images/allow-gh-actions-1.png)\r\n\r\nОткройте меню `Actions`\r\n\r\n![allow-gh-actions-2](images/allow-gh-actions-2.png)\r\n\r\nНажмите `General`\r\n\r\n![allow-gh-actions-3](images/allow-gh-actions-3.png)\r\n\r\nУстановите `Allow all actions to be run`\r\n\r\n![allow-gh-actions-4](images/allow-gh-actions-4.png)\r\n\r\n### Enable GitHub Actions\r\n\r\nПереместитесь на вкладку `Actions`\r\n\r\n![enable-gh-actions-1](images/enable-gh-actions-1.png)\r\n\r\nНажмите `Enable Actions on this repository` что бы включить Actions\r\n\r\n![enable-gh-actions-2](images/enable-gh-actions-2.png)\r\n\r\n### Загрузите свой .jar-файл и запустите сборку .dll\r\n\r\nПереместитесь на вкладку `Code`\r\n\r\n![upload-1](images/upload-1.png)\r\n\r\nОткройте меню `Add file`\r\n\r\n![upload-2](images/upload-2.png)\r\n\r\nНажмите `Upload files` для загрузки вашего .jar-файла\r\n\r\n![upload-3](images/upload-3.png)\r\n\r\nПереименуйте свой .jar-файл на вашем компьютере в `input.jar` (ОЧЕНЬ ВАЖНО!) и перетащите его сюда\r\n\r\n![upload-4](images/upload-4.png)\r\n\r\nУбедитесь, что он загружен, и нажмите `Commit changes`\r\n\r\n![upload-5](images/upload-5.png)\r\n\r\nКак будет загружен файл, перейдите во вкладку `Actions`\r\n\r\n![upload-6](images/upload-6.png)\r\n\r\nЗдесь нажмите на запущенный Action\r\n\r\n![upload-7](images/upload-7.png)\r\n\r\nДождитесь его выполнения\r\n\r\n![upload-8](images/upload-8.png)\r\n\r\nОбновите страницу и убедитесь, что предупреждений нет. Теперь вы можете скачать свой .dll-файл и использовать его по своему усмотрению!\r\n\r\n![upload-9](images/upload-9.png)"
  },
  {
    "path": "header-converter-src/HeaderConverter.java",
    "content": "import java.io.ByteArrayOutputStream;\r\nimport java.io.EOFException;\r\nimport java.io.IOException;\r\nimport java.io.InputStream;\r\nimport java.io.OutputStream;\r\nimport java.nio.charset.StandardCharsets;\r\nimport java.nio.file.Files;\r\nimport java.nio.file.Paths;\r\nimport java.util.Map;\r\nimport java.util.jar.JarFile;\r\nimport java.util.stream.Collectors;\r\nimport java.util.zip.ZipEntry;\r\nimport java.util.HashMap;\r\nimport java.nio.ByteBuffer;\r\nimport java.nio.ByteOrder;\r\nimport java.util.List;\r\nimport java.util.ArrayList;\r\nimport java.util.Collections;\r\n\r\npublic class HeaderConverter {\r\n\r\n    private static class ClassFile implements Comparable<ClassFile> {\r\n        private String name;\r\n        private String superClass;\r\n        private String[] interfaces;\r\n        private byte[] classData;\r\n        private String[] cpStrings;\r\n        private short[] cpClasses;\r\n        private int priority = 0;\r\n        private static final int HEAD = -889275714;\r\n        private static final byte CONSTANT_Utf8 = 1;\r\n        private static final byte CONSTANT_Integer = 3;\r\n        private static final byte CONSTANT_Float = 4;\r\n        private static final byte CONSTANT_Long = 5;\r\n        private static final byte CONSTANT_Double = 6;\r\n        private static final byte CONSTANT_Class = 7;\r\n        private static final byte CONSTANT_String = 8;\r\n        private static final byte CONSTANT_FieldRef = 9;\r\n        private static final byte CONSTANT_MethodRef = 10;\r\n        private static final byte CONSTANT_InterfaceMethodRef = 11;\r\n        private static final byte CONSTANT_NameAndType = 12;\r\n        private static final byte CONSTANT_MethodHandle = 15;\r\n        private static final byte CONSTANT_MethodType = 16;\r\n        private static final byte CONSTANT_InvokeDynamic = 18;\r\n\r\n        public ClassFile(byte[] classData) {\r\n            this.classData = classData;\r\n            this.parse(ByteBuffer.wrap(classData));\r\n        }\r\n\r\n        private void parse(ByteBuffer buf) {\r\n            if (buf.order(ByteOrder.BIG_ENDIAN).getInt() != HEAD) {\r\n                throw new RuntimeException(\"Not a class file\");\r\n            }\r\n            buf.getChar();\r\n            buf.getChar();\r\n            int cpSize = buf.getChar();\r\n            this.cpStrings = new String[cpSize];\r\n            this.cpClasses = new short[cpSize];\r\n\r\n            for (int i = 1; i < cpSize; i++) {\r\n                byte tag = buf.get();\r\n                switch (tag) {\r\n                    case CONSTANT_Utf8:\r\n                        this.cpStrings[i] = this.decodeString(buf);\r\n                        break;\r\n                    default:\r\n                        throw new RuntimeException(\"Failed to read constant pool because of type \" + tag);\r\n                    case CONSTANT_Integer:\r\n                        buf.getInt();\r\n                        break;\r\n                    case CONSTANT_Float:\r\n                        buf.getFloat();\r\n                        break;\r\n                    case CONSTANT_Long:\r\n                        buf.getLong();\r\n                        ++i;\r\n                        break;\r\n                    case CONSTANT_Double:\r\n                        buf.getDouble();\r\n                        ++i;\r\n                        break;\r\n                    case CONSTANT_Class:\r\n                        this.cpClasses[i] = buf.getShort();\r\n                        break;\r\n                    case CONSTANT_String:\r\n                    case CONSTANT_MethodType:\r\n                        buf.getChar();\r\n                        break;\r\n                    case CONSTANT_FieldRef:\r\n                    case CONSTANT_MethodRef:\r\n                    case CONSTANT_InterfaceMethodRef:\r\n                    case CONSTANT_NameAndType:\r\n                        buf.getChar();\r\n                        buf.getChar();\r\n                        break;\r\n                    case CONSTANT_MethodHandle:\r\n                        buf.get();\r\n                        buf.getChar();\r\n                        break;\r\n                    case CONSTANT_InvokeDynamic:\r\n                        buf.getChar();\r\n                        buf.getChar();\r\n                        break;\r\n                }\r\n            }\r\n\r\n            buf.getChar();\r\n            this.name = this.cpStrings[this.cpClasses[buf.getChar()]];\r\n            this.superClass = this.cpStrings[this.cpClasses[buf.getChar()]];\r\n            this.interfaces = new String[buf.getChar()];\r\n\r\n            for (int i = 0; i < this.interfaces.length; i++) {\r\n                this.interfaces[i] = this.cpStrings[this.cpClasses[buf.getChar()]];\r\n            }\r\n        }\r\n\r\n        private String decodeString(ByteBuffer buf) {\r\n            int size = buf.getChar();\r\n            int oldLimit = buf.limit();\r\n            buf.limit(buf.position() + size);\r\n            StringBuilder sb = new StringBuilder(size + (size >> 1) + 16);\r\n\r\n            while (buf.hasRemaining()) {\r\n                byte b = buf.get();\r\n                if (b > 0) {\r\n                    sb.append((char)b);\r\n                } else {\r\n                    int b2 = buf.get();\r\n                    if ((b & 240) != 224) {\r\n                        sb.append((char)((b & 31) << 6 | b2 & 63));\r\n                    } else {\r\n                        int b3 = buf.get();\r\n                        sb.append((char)((b & 15) << 12 | (b2 & 63) << 6 | b3 & 63));\r\n                    }\r\n                }\r\n            }\r\n\r\n            buf.limit(oldLimit);\r\n            return sb.toString();\r\n        }\r\n\r\n        public String getName() {\r\n            return this.name;\r\n        }\r\n\r\n        public String getSuperClass() {\r\n            return this.superClass;\r\n        }\r\n\r\n        public String[] getInterfaces() {\r\n            return this.interfaces;\r\n        }\r\n\r\n        public int getPriority() {\r\n            return priority;\r\n        }\r\n\r\n        public void setPriority(int priority) {\r\n            this.priority = priority;\r\n        }\r\n\r\n        public byte[] getClassData() {\r\n            return this.classData;\r\n        }\r\n\r\n        @Override\r\n        public int compareTo(ClassFile o) {\r\n            return o.priority - this.priority;\r\n        }      \r\n    }\r\n\r\n    private static String convertByteArrayToCppString(byte[] data) {\r\n        StringBuilder result = new StringBuilder();\r\n        result.append(\"{ \");\r\n        for (byte b : data) {\r\n            result.append(b).append(\", \");\r\n        }\r\n        return result.append(\"}\").toString();\r\n    }\r\n\r\n    private static byte[] readStreamFully(InputStream stream) throws IOException {\r\n        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();\r\n        byte[] buffer = new byte[4096];\r\n        while (true) {\r\n            int read = stream.read(buffer);\r\n\r\n            if (read == -1) {\r\n                break;\r\n            }\r\n\r\n            outputStream.write(buffer, 0, read);\r\n        }\r\n        return outputStream.toByteArray();\r\n    }\r\n\r\n    private static void processInjectorClass(String inputPath, String outputPath) throws IOException {\r\n        byte[] classData = readStreamFully(Files.newInputStream(Paths.get(inputPath)));\r\n        String cppDataString = convertByteArrayToCppString(classData);\r\n\r\n        StringBuilder resultFile = new StringBuilder();\r\n        resultFile.append(\"#ifndef CLASSES_INJECTOR_H_\\n#define CLASSES_INJECTOR_H_\\n\\n#include \\\"../jvm/jni.h\\\"\\n\\nconst jbyte injector_class_data[] = \")\r\n            .append(cppDataString)\r\n            .append(\";\\n\\n#endif  //CLASSES_INJECTOR_H_\");\r\n\r\n        try (OutputStream outputStream = Files.newOutputStream(Paths.get(outputPath))) {\r\n            outputStream.write(resultFile.toString().getBytes(StandardCharsets.UTF_8));\r\n        }\r\n    }\r\n\r\n    private static void processInputJar(String inputPath, String outputPath) throws IOException {\r\n        Map<String, ClassFile> classes = new HashMap<>();\r\n        try (JarFile jarFile = new JarFile(inputPath)) {\r\n            for (ZipEntry entry : jarFile.stream().collect(Collectors.toList())) {\r\n                if (!entry.getName().endsWith(\".class\")) {\r\n                    continue;\r\n                }\r\n                try (InputStream stream = jarFile.getInputStream(entry)) {\r\n                    ClassFile classFile = new ClassFile(readStreamFully(stream));\r\n                    classes.put(classFile.getName(), classFile);\r\n                }\r\n            }\r\n        }\r\n\r\n        System.out.println(\"Processing \" + classes.size() + \" classes\");\r\n\r\n        classes.values().forEach((class1) -> {\r\n            classes.values().forEach((class2) -> {\r\n                if (classes.containsKey(class2.getSuperClass())) {\r\n                    classes.get(class2.getSuperClass()).setPriority(\r\n                        Math.max(classes.get(class2.getSuperClass()).getPriority(), \r\n                                class2.getPriority() + 1)\r\n                    );\r\n                }\r\n\r\n                for (String superInterface : class2.getInterfaces()) {\r\n                    if (classes.containsKey(superInterface)) {\r\n                        classes.get(superInterface).setPriority(\r\n                            Math.max(classes.get(superInterface).getPriority(), \r\n                                    class2.getPriority() + 1)\r\n                        );\r\n                    }\r\n                }\r\n            });\r\n        });\r\n\r\n        System.out.println(\"Load priority calculated, sorting...\");\r\n\r\n        List<ClassFile> resultClasses = new ArrayList<>(classes.values());\r\n\r\n        Collections.sort(resultClasses);\r\n\r\n        List<String> classDataStrings = new ArrayList<>();\r\n        for (ClassFile file : resultClasses) {\r\n            classDataStrings.add(convertByteArrayToCppString(file.getClassData()));\r\n        }\r\n        \r\n        StringBuilder resultFile = new StringBuilder();\r\n        resultFile.append(\"#ifndef CLASSES_JAR_H_\\n#define CLASSES_JAR_H_\\n\\n#include \\\"../jvm/jni.h\\\"\\n\\n\");\r\n        for (int i = 0; i < classDataStrings.size(); i++) {\r\n            resultFile.append(\"const jbyte class_data_\").append(i).append(\"[] = \").append(classDataStrings.get(i)).append(\";\\n\");\r\n        }\r\n        resultFile.append(\"\\nconst jbyte* jar_classes_data[] = { \");\r\n        for (int i = 0; i < classDataStrings.size(); i++) {\r\n            resultFile.append(\"class_data_\").append(i).append(\", \");\r\n        }\r\n        resultFile.append(\"};\\n\\nconst jint jar_classes_sizes[] = {\");\r\n        for (ClassFile file : resultClasses) {\r\n            resultFile.append(file.getClassData().length).append(\", \");\r\n        }\r\n        resultFile.append(\"};\\n\\n#endif  //CLASSES_JAR_H_\");\r\n\r\n        try (OutputStream outputStream = Files.newOutputStream(Paths.get(outputPath))) {\r\n            outputStream.write(resultFile.toString().getBytes(StandardCharsets.UTF_8));\r\n        }\r\n    }\r\n\r\n    public static void main(String[] args) throws Throwable {\r\n        if (args.length != 3) {\r\n            throw new RuntimeException(\"Wrong number of arguments, usage: <injector/input-jar> <input jar or class file> <output path>\");\r\n        }\r\n\r\n        String type = args[0];\r\n        String input = args[1];\r\n        String output = args[2];\r\n\r\n        switch (type) {\r\n            case \"injector\":\r\n                processInjectorClass(input, output);\r\n                break;\r\n            case \"input-jar\":\r\n                processInputJar(input, output);\r\n                break;\r\n        }\r\n\r\n        System.out.println(\"Ready for \" + type);\r\n    }\r\n}"
  },
  {
    "path": "injector-src/ForgeInjector.java",
    "content": "import java.io.File;\r\nimport java.io.PrintWriter;\r\nimport java.lang.reflect.InvocationTargetException;\r\nimport java.lang.reflect.Method;\r\nimport java.security.ProtectionDomain;\r\nimport java.util.ArrayList;\r\n\r\npublic class ForgeInjector extends Thread {\r\n    private byte[][] classes;\r\n\r\n    private ForgeInjector(byte[][] classes) {\r\n        this.classes = classes;\r\n    }\r\n\r\n    public static void inject(byte[][] classes) {\r\n        new Thread(new ForgeInjector(classes)).start();\r\n    }\r\n\r\n    private static Class tryGetClass(PrintWriter writer, ClassLoader cl, String... names) throws ClassNotFoundException {\r\n    \tClassNotFoundException lastException = null;\r\n    \tfor (String name : names) {\r\n    \t\ttry {\r\n    \t\t\treturn cl.loadClass(name);\r\n    \t\t} catch (ClassNotFoundException e) {\r\n    \t\t\tlastException = e;\r\n    \t\t}\r\n    \t}\r\n    \tthrow lastException;\r\n    }\r\n\r\n    @Override\r\n    public void run() {\r\n        try (PrintWriter writer = new PrintWriter(System.getProperty(\"user.home\") + File.separator + \"jar-to-dll-log.txt\", \"UTF-8\")) {\r\n            writer.println(\"Starting!\");\r\n            writer.flush();\r\n            try {\r\n                ClassLoader cl = null;\r\n                for (Thread thread : Thread.getAllStackTraces().keySet()) {\r\n                    ClassLoader threadLoader;\r\n                    if (thread == null || thread.getContextClassLoader() == null || (threadLoader = thread.getContextClassLoader()).getClass() == null || \r\n                        threadLoader.getClass().getName() == null) continue;\r\n                    String loaderName = threadLoader.getClass().getName();\r\n                    writer.println(\"Thread: \" + thread.getName() + \" [\" + loaderName + \"]\");\r\n                    writer.flush();\r\n                    if (!loaderName.contains(\"LaunchClassLoader\") && !loaderName.contains(\"RelaunchClassLoader\") && !loaderName.contains(\"TransformingClassLoader\")) continue;\r\n                    cl = threadLoader;\r\n                    break;\r\n                }\r\n                if (cl == null) {\r\n                    throw new Exception(\"ClassLoader is null\");\r\n                }\r\n                this.setContextClassLoader(cl);\r\n                Class modAnnotation = tryGetClass(writer, cl, \"cpw.mods.fml.common.Mod\", \"net.minecraftforge.fml.common.Mod\");\r\n                Class forgeEventHandlerAnnotation = null;\r\n                Class fmlInitializationEventClass = null;\r\n                Class fmlPreInitializationEventClass = null;\r\n                try {\r\n                    forgeEventHandlerAnnotation = tryGetClass(writer, cl, \"cpw.mods.fml.common.Mod$EventHandler\", \"net.minecraftforge.fml.common.Mod$EventHandler\");\r\n                    fmlPreInitializationEventClass = tryGetClass(writer, cl, \"cpw.mods.fml.common.event.FMLPreInitializationEvent\", \"net.minecraftforge.fml.common.event.FMLPreInitializationEvent\");\r\n                    fmlInitializationEventClass = tryGetClass(writer, cl, \"cpw.mods.fml.common.event.FMLInitializationEvent\", \"net.minecraftforge.fml.common.event.FMLInitializationEvent\");\r\n                } catch (Exception e) {\r\n                    writer.println(\"Event handler annotations not found, probably new version of FML\");\r\n                }\r\n                Method loadMethod = ClassLoader.class.getDeclaredMethod(\"defineClass\", String.class, byte[].class, Integer.TYPE, Integer.TYPE, ProtectionDomain.class);\r\n                loadMethod.setAccessible(true);\r\n                writer.println(\"Loading \" + classes.length + \" classes\");\r\n                writer.flush();\r\n                ArrayList<Object[]> mods = new ArrayList<>();\r\n                for (byte[] classData : classes) {\r\n                    if (classData == null) {\r\n                        throw new Exception(\"classData is null\");\r\n                    }\r\n                    if (cl.getClass() == null) {\r\n                        throw new Exception(\"getClass() is null\");\r\n                    }\r\n                    try {\r\n                        Class tClass = null;\r\n                        try {\r\n                            tClass = (Class)loadMethod.invoke(cl, null, classData, 0, classData.length, cl.getClass().getProtectionDomain());\r\n                        } catch (Throwable e) {\r\n                            if (!(e instanceof LinkageError)) {\r\n                                throw e;\r\n                            }\r\n\r\n                            if (e.getMessage().contains(\"duplicate class definition for name: \")) {\r\n                                String className = e.getMessage().split(\"\\\"\")[1];\r\n                                tClass = cl.loadClass(className.replace('/', '.'));\r\n                                writer.println(\"It is recommended to remove \" + className + \".class from your input.jar\");\r\n                            }\r\n                        }\r\n                        if (tClass.getAnnotation(modAnnotation) == null) \r\n                        \tcontinue;\r\n                        Object[] mod = new Object[3];\r\n                        mod[0] = tClass;\r\n                        ArrayList<Method> fmlPreInitMethods = new ArrayList<Method>();\r\n                        ArrayList<Method> fmlInitMethods = new ArrayList<Method>();\r\n                        if (forgeEventHandlerAnnotation != null) {\r\n                            for (Method m : tClass.getDeclaredMethods()) {\r\n                                if (m.getAnnotation(forgeEventHandlerAnnotation) != null && m.getParameterCount() == 1 && m.getParameterTypes()[0] == fmlInitializationEventClass) {\r\n                                    m.setAccessible(true);\r\n                                    fmlInitMethods.add(m);\r\n                                }\r\n                                if (m.getAnnotation(forgeEventHandlerAnnotation) != null && m.getParameterCount() == 1 && m.getParameterTypes()[0] == fmlPreInitializationEventClass) {\r\n                                    m.setAccessible(true);\r\n                                    fmlPreInitMethods.add(m);\r\n                                }\r\n                            }\r\n                        }\r\n                        mod[1] = fmlPreInitMethods;\r\n                        mod[2] = fmlInitMethods;\r\n                        mods.add(mod);\r\n                    }\r\n                    catch (Exception e) {\r\n                        e.printStackTrace();\r\n                        throw new Exception(\"Exception on defineClass\", e);\r\n                    }\r\n                }\r\n                writer.println(classes.length + \" loaded successfully\");\r\n                writer.flush();\r\n                for (Object[] mod : mods) {\r\n                \tClass modClass = (Class) mod[0];\r\n                \tArrayList<Method> fmlPreInitMethods = (ArrayList<Method>) mod[1];\r\n                \tArrayList<Method> fmlInitMethods = (ArrayList<Method>) mod[2];\r\n                \tObject modInstance = null;\r\n\r\n\t\t\t\t\ttry {\r\n                        writer.println(\"Instancing \" + modClass.getName());\r\n                        writer.flush();\r\n                        modInstance = modClass.newInstance();\r\n                        writer.println(\"Instanced\");\r\n                        writer.flush();\r\n                    }\r\n                    catch (Exception e) {\r\n                        writer.println(\"Genexeption on instancing: \" + e);\r\n                        e.printStackTrace(writer);\r\n                        writer.flush();\r\n                        throw new Exception(\"Exception on instancing\", e);\r\n                    }\r\n\r\n                    for (Method preInitMethod : fmlPreInitMethods) {\r\n\t                    try {\r\n\t                        writer.println(\"Preiniting \" + preInitMethod);\r\n\t                        writer.flush();\r\n\t                        writer.println(\"Preinited\");\r\n\t                        writer.flush();\r\n\t                        preInitMethod.invoke(modInstance, new Object[]{null});\r\n\t                    }\r\n\t                    catch (InvocationTargetException e) {\r\n\t                        writer.println(\"InvocationTargetException on preiniting: \" + e);\r\n\t                        e.getCause().printStackTrace(writer);\r\n\t                        writer.flush();\r\n\t                        throw new Exception(\"Exception on preiniting (InvocationTargetException)\", e.getCause());\r\n\t                    }\r\n\t                    catch (Exception e) {\r\n\t                        writer.println(\"Genexeption on preiniting: \" + e);\r\n\t                        e.printStackTrace(writer);\r\n\t                        writer.flush();\r\n\t                        throw new Exception(\"Exception on preiniting\", e);\r\n\t                    }\r\n                \t}\r\n\r\n                \tfor (Method initMethod : fmlInitMethods) {\r\n\t                    try {\r\n\t                        writer.println(\"Initing \" + initMethod);\r\n\t                        writer.flush();\r\n\t                        writer.println(\"Inited\");\r\n\t                        writer.flush();\r\n\t                        initMethod.invoke(modInstance, new Object[]{null});\r\n\t                    }\r\n\t                    catch (InvocationTargetException e) {\r\n\t                        writer.println(\"InvocationTargetException on initing: \" + e);\r\n\t                        e.getCause().printStackTrace(writer);\r\n\t                        writer.flush();\r\n\t                        throw new Exception(\"Exception on initing (InvocationTargetException)\", e.getCause());\r\n\t                    }\r\n\t                    catch (Exception e) {\r\n\t                        writer.println(\"Genexeption on initing: \" + e);\r\n\t                        e.printStackTrace(writer);\r\n\t                        writer.flush();\r\n\t                        throw new Exception(\"Exception on initing\", e);\r\n\t                    }\r\n                \t}\r\n                }\r\n                writer.println(\"Successfully injected\");\r\n                writer.flush();\r\n            }\r\n            catch (Throwable e) {\r\n                e.printStackTrace(writer);\r\n                writer.flush();\r\n            }\r\n            writer.close();\r\n        }\r\n        catch (Throwable e) {\r\n            e.printStackTrace();\r\n        }\r\n    }\r\n}"
  },
  {
    "path": "native-src/classes/.gitkeep",
    "content": ""
  },
  {
    "path": "native-src/injector.cpp",
    "content": "#include <windows.h>\r\n#include <winuser.h>\r\n\r\n#include \"injector.h\"\r\n#include \"jvm/jni.h\"\r\n#include \"utils.h\"\r\n\r\n#if __has_include(\"classes/injector.h\")\r\n#include \"classes/injector.h\"\r\n#else\r\n#include \"stub_classes/injector.h\"\r\n#endif\r\n\r\n#if __has_include(\"classes/jar.h\")\r\n#include \"classes/jar.h\"\r\n#else\r\n#include \"stub_classes/jar.h\"\r\n#endif\r\n\r\nstatic HMODULE GetJvmDll() {\r\n  const auto jvm_dll = GetModuleHandleW(L\"jvm.dll\");\r\n  if (!jvm_dll) {\r\n    Error(L\"Can't get jvm.dll handle\");\r\n  }\r\n  return jvm_dll;\r\n}\r\n\r\ntypedef jint(JNICALL* GetCreatedJavaVMs)(JavaVM**, jsize, jsize*);\r\n\r\nstatic GetCreatedJavaVMs GetGetCreatedJavaVMsProc(HMODULE jvm_dll) {\r\n  const auto get_created_java_vms_raw_proc =\r\n      GetProcAddress(jvm_dll, \"JNI_GetCreatedJavaVMs\");\r\n  if (!get_created_java_vms_raw_proc) {\r\n    Error(L\"Can't get JNI_GetCreatedJavaVMs proc\");\r\n  }\r\n  return reinterpret_cast<GetCreatedJavaVMs>(get_created_java_vms_raw_proc);\r\n}\r\n\r\nstatic JavaVM* GetJVM() {\r\n  const auto jvm_dll = GetJvmDll();\r\n  const auto get_created_java_vms = GetGetCreatedJavaVMsProc(jvm_dll);\r\n\r\n  JavaVM* jvms[1];\r\n  jsize n_vms = 1;\r\n  get_created_java_vms(jvms, n_vms, &n_vms);\r\n\r\n  if (n_vms == 0) {\r\n    Error(L\"Can't get JVM\");\r\n  }\r\n\r\n  return jvms[0];\r\n}\r\n\r\nstatic void GetJNIEnv(JavaVM* jvm, JNIEnv*& jni_env) {\r\n  jni_env = nullptr;\r\n  jvm->AttachCurrentThread(reinterpret_cast<void**>(&jni_env), nullptr);\r\n  jvm->GetEnv(reinterpret_cast<void**>(&jni_env), JNI_VERSION_1_8);\r\n\r\n  if (!jni_env) {\r\n    Error(L\"Can't get JNIEnv\");\r\n  }\r\n}\r\n\r\nstatic jclass DefineOrGetInjector(JNIEnv* jni_env) {\r\n  const auto existing_injector_class = jni_env->FindClass(INJECTOR_CLASS_NAME);\r\n  if (existing_injector_class) {\r\n    ShowMessage(L\"Injector class is already presented in jvm, using it\");\r\n    return existing_injector_class;\r\n  }\r\n  const auto injector_class = jni_env->DefineClass(\r\n      nullptr, nullptr, injector_class_data, sizeof(injector_class_data));\r\n  if (!injector_class) {\r\n    Error(L\"Failed to define injector class\");\r\n  }\r\n  return injector_class;\r\n}\r\n\r\nstatic jobjectArray GetJarClassesArray(JNIEnv* jni_env) {\r\n  const auto byte_array_class = jni_env->FindClass(\"[B\");\r\n  if (!byte_array_class) {\r\n    Error(L\"Failed to get byte array class\");\r\n  }\r\n  const auto jar_classes_array = jni_env->NewObjectArray(\r\n      sizeof(jar_classes_sizes) / sizeof(jar_classes_sizes[0]),\r\n      byte_array_class, nullptr);\r\n  if (!jar_classes_array) {\r\n    Error(L\"Failed to create jar classes array\");\r\n  }\r\n  for (size_t i = 0;\r\n       i < sizeof(jar_classes_sizes) / sizeof(jar_classes_sizes[0]); i++) {\r\n    const auto class_byte_array = jni_env->NewByteArray(jar_classes_sizes[i]);\r\n    if (!class_byte_array) {\r\n      Error(L\"Failed to create class byte array\");\r\n    }\r\n    jni_env->SetByteArrayRegion(class_byte_array, 0, jar_classes_sizes[i],\r\n                                jar_classes_data[i]);\r\n    jni_env->SetObjectArrayElement(jar_classes_array, static_cast<jint>(i),\r\n                                   class_byte_array);\r\n  }\r\n\r\n  return jar_classes_array;\r\n}\r\n\r\nstatic void CallInjector(JNIEnv* jni_env, jclass injector_class,\r\n                  jobjectArray jar_classes_array) {\r\n  const auto inject_method_id =\r\n      jni_env->GetStaticMethodID(injector_class, \"inject\", \"([[B)V\");\r\n  if (!inject_method_id) {\r\n    Error(L\"Failed to find inject method ID\");\r\n  }\r\n\r\n  jni_env->CallStaticVoidMethod(\r\n      injector_class, inject_method_id, jar_classes_array);\r\n  ShowMessage(L\"Native part ready, now java part is injecting\");\r\n}\r\n\r\nvoid RunInjector() {\r\n  ShowMessage(L\"Starting\");\r\n\r\n  const auto jvm = GetJVM();\r\n\r\n  JNIEnv* jni_env;\r\n  GetJNIEnv(jvm, jni_env);\r\n\r\n  const auto injector_class = DefineOrGetInjector(jni_env);\r\n  const auto jar_classes_array = GetJarClassesArray(jni_env);\r\n\r\n  CallInjector(jni_env, injector_class, jar_classes_array);\r\n\r\n  FreeLibraryAndExitThread(::global_dll_instance, 0);\r\n}"
  },
  {
    "path": "native-src/injector.h",
    "content": "#ifndef INJECTOR_H_\r\n#define INJECTOR_H_\r\n\r\n#define INJECTOR_CLASS_NAME \"ForgeInjector\"\r\n\r\nvoid RunInjector();\r\n\r\n#endif  //INJECTOR_H_\r\n"
  },
  {
    "path": "native-src/jvm/jni.h",
    "content": "/*\r\n * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.\r\n * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.\r\n *\r\n *\r\n *\r\n *\r\n *\r\n *\r\n *\r\n *\r\n *\r\n *\r\n *\r\n *\r\n *\r\n *\r\n *\r\n *\r\n *\r\n *\r\n *\r\n *\r\n */\r\n\r\n/*\r\n * We used part of Netscape's Java Runtime Interface (JRI) as the starting\r\n * point of our design and implementation.\r\n */\r\n\r\n/******************************************************************************\r\n * Java Runtime Interface\r\n * Copyright (c) 1996 Netscape Communications Corporation. All rights reserved.\r\n *****************************************************************************/\r\n\r\n#ifndef _JAVASOFT_JNI_H_\r\n#define _JAVASOFT_JNI_H_\r\n\r\n#include <stdio.h>\r\n#include <stdarg.h>\r\n\r\n/* jni_md.h contains the machine-dependent typedefs for jbyte, jint\r\n   and jlong */\r\n\r\n#include \"jni_md.h\"\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\n/*\r\n * JNI Types\r\n */\r\n\r\n#ifndef JNI_TYPES_ALREADY_DEFINED_IN_JNI_MD_H\r\n\r\ntypedef unsigned char   jboolean;\r\ntypedef unsigned short  jchar;\r\ntypedef short           jshort;\r\ntypedef float           jfloat;\r\ntypedef double          jdouble;\r\n\r\ntypedef jint            jsize;\r\n\r\n#ifdef __cplusplus\r\n\r\nclass _jobject {};\r\nclass _jclass : public _jobject {};\r\nclass _jthrowable : public _jobject {};\r\nclass _jstring : public _jobject {};\r\nclass _jarray : public _jobject {};\r\nclass _jbooleanArray : public _jarray {};\r\nclass _jbyteArray : public _jarray {};\r\nclass _jcharArray : public _jarray {};\r\nclass _jshortArray : public _jarray {};\r\nclass _jintArray : public _jarray {};\r\nclass _jlongArray : public _jarray {};\r\nclass _jfloatArray : public _jarray {};\r\nclass _jdoubleArray : public _jarray {};\r\nclass _jobjectArray : public _jarray {};\r\n\r\ntypedef _jobject *jobject;\r\ntypedef _jclass *jclass;\r\ntypedef _jthrowable *jthrowable;\r\ntypedef _jstring *jstring;\r\ntypedef _jarray *jarray;\r\ntypedef _jbooleanArray *jbooleanArray;\r\ntypedef _jbyteArray *jbyteArray;\r\ntypedef _jcharArray *jcharArray;\r\ntypedef _jshortArray *jshortArray;\r\ntypedef _jintArray *jintArray;\r\ntypedef _jlongArray *jlongArray;\r\ntypedef _jfloatArray *jfloatArray;\r\ntypedef _jdoubleArray *jdoubleArray;\r\ntypedef _jobjectArray *jobjectArray;\r\n\r\n#else\r\n\r\nstruct _jobject;\r\n\r\ntypedef struct _jobject *jobject;\r\ntypedef jobject jclass;\r\ntypedef jobject jthrowable;\r\ntypedef jobject jstring;\r\ntypedef jobject jarray;\r\ntypedef jarray jbooleanArray;\r\ntypedef jarray jbyteArray;\r\ntypedef jarray jcharArray;\r\ntypedef jarray jshortArray;\r\ntypedef jarray jintArray;\r\ntypedef jarray jlongArray;\r\ntypedef jarray jfloatArray;\r\ntypedef jarray jdoubleArray;\r\ntypedef jarray jobjectArray;\r\n\r\n#endif\r\n\r\ntypedef jobject jweak;\r\n\r\ntypedef union jvalue {\r\n    jboolean z;\r\n    jbyte    b;\r\n    jchar    c;\r\n    jshort   s;\r\n    jint     i;\r\n    jlong    j;\r\n    jfloat   f;\r\n    jdouble  d;\r\n    jobject  l;\r\n} jvalue;\r\n\r\nstruct _jfieldID;\r\ntypedef struct _jfieldID *jfieldID;\r\n\r\nstruct _jmethodID;\r\ntypedef struct _jmethodID *jmethodID;\r\n\r\n/* Return values from jobjectRefType */\r\ntypedef enum _jobjectType {\r\n     JNIInvalidRefType    = 0,\r\n     JNILocalRefType      = 1,\r\n     JNIGlobalRefType     = 2,\r\n     JNIWeakGlobalRefType = 3\r\n} jobjectRefType;\r\n\r\n\r\n#endif /* JNI_TYPES_ALREADY_DEFINED_IN_JNI_MD_H */\r\n\r\n/*\r\n * jboolean constants\r\n */\r\n\r\n#define JNI_FALSE 0\r\n#define JNI_TRUE 1\r\n\r\n/*\r\n * possible return values for JNI functions.\r\n */\r\n\r\n#define JNI_OK           0                 /* success */\r\n#define JNI_ERR          (-1)              /* unknown error */\r\n#define JNI_EDETACHED    (-2)              /* thread detached from the VM */\r\n#define JNI_EVERSION     (-3)              /* JNI version error */\r\n#define JNI_ENOMEM       (-4)              /* not enough memory */\r\n#define JNI_EEXIST       (-5)              /* VM already created */\r\n#define JNI_EINVAL       (-6)              /* invalid arguments */\r\n\r\n/*\r\n * used in ReleaseScalarArrayElements\r\n */\r\n\r\n#define JNI_COMMIT 1\r\n#define JNI_ABORT 2\r\n\r\n/*\r\n * used in RegisterNatives to describe native method name, signature,\r\n * and function pointer.\r\n */\r\n\r\ntypedef struct {\r\n    char *name;\r\n    char *signature;\r\n    void *fnPtr;\r\n} JNINativeMethod;\r\n\r\n/*\r\n * JNI Native Method Interface.\r\n */\r\n\r\nstruct JNINativeInterface_;\r\n\r\nstruct JNIEnv_;\r\n\r\n#ifdef __cplusplus\r\ntypedef JNIEnv_ JNIEnv;\r\n#else\r\ntypedef const struct JNINativeInterface_ *JNIEnv;\r\n#endif\r\n\r\n/*\r\n * JNI Invocation Interface.\r\n */\r\n\r\nstruct JNIInvokeInterface_;\r\n\r\nstruct JavaVM_;\r\n\r\n#ifdef __cplusplus\r\ntypedef JavaVM_ JavaVM;\r\n#else\r\ntypedef const struct JNIInvokeInterface_ *JavaVM;\r\n#endif\r\n\r\nstruct JNINativeInterface_ {\r\n    void *reserved0;\r\n    void *reserved1;\r\n    void *reserved2;\r\n\r\n    void *reserved3;\r\n    jint (JNICALL *GetVersion)(JNIEnv *env);\r\n\r\n    jclass (JNICALL *DefineClass)\r\n      (JNIEnv *env, const char *name, jobject loader, const jbyte *buf,\r\n       jsize len);\r\n    jclass (JNICALL *FindClass)\r\n      (JNIEnv *env, const char *name);\r\n\r\n    jmethodID (JNICALL *FromReflectedMethod)\r\n      (JNIEnv *env, jobject method);\r\n    jfieldID (JNICALL *FromReflectedField)\r\n      (JNIEnv *env, jobject field);\r\n\r\n    jobject (JNICALL *ToReflectedMethod)\r\n      (JNIEnv *env, jclass cls, jmethodID methodID, jboolean isStatic);\r\n\r\n    jclass (JNICALL *GetSuperclass)\r\n      (JNIEnv *env, jclass sub);\r\n    jboolean (JNICALL *IsAssignableFrom)\r\n      (JNIEnv *env, jclass sub, jclass sup);\r\n\r\n    jobject (JNICALL *ToReflectedField)\r\n      (JNIEnv *env, jclass cls, jfieldID fieldID, jboolean isStatic);\r\n\r\n    jint (JNICALL *Throw)\r\n      (JNIEnv *env, jthrowable obj);\r\n    jint (JNICALL *ThrowNew)\r\n      (JNIEnv *env, jclass clazz, const char *msg);\r\n    jthrowable (JNICALL *ExceptionOccurred)\r\n      (JNIEnv *env);\r\n    void (JNICALL *ExceptionDescribe)\r\n      (JNIEnv *env);\r\n    void (JNICALL *ExceptionClear)\r\n      (JNIEnv *env);\r\n    void (JNICALL *FatalError)\r\n      (JNIEnv *env, const char *msg);\r\n\r\n    jint (JNICALL *PushLocalFrame)\r\n      (JNIEnv *env, jint capacity);\r\n    jobject (JNICALL *PopLocalFrame)\r\n      (JNIEnv *env, jobject result);\r\n\r\n    jobject (JNICALL *NewGlobalRef)\r\n      (JNIEnv *env, jobject lobj);\r\n    void (JNICALL *DeleteGlobalRef)\r\n      (JNIEnv *env, jobject gref);\r\n    void (JNICALL *DeleteLocalRef)\r\n      (JNIEnv *env, jobject obj);\r\n    jboolean (JNICALL *IsSameObject)\r\n      (JNIEnv *env, jobject obj1, jobject obj2);\r\n    jobject (JNICALL *NewLocalRef)\r\n      (JNIEnv *env, jobject ref);\r\n    jint (JNICALL *EnsureLocalCapacity)\r\n      (JNIEnv *env, jint capacity);\r\n\r\n    jobject (JNICALL *AllocObject)\r\n      (JNIEnv *env, jclass clazz);\r\n    jobject (JNICALL *NewObject)\r\n      (JNIEnv *env, jclass clazz, jmethodID methodID, ...);\r\n    jobject (JNICALL *NewObjectV)\r\n      (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);\r\n    jobject (JNICALL *NewObjectA)\r\n      (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args);\r\n\r\n    jclass (JNICALL *GetObjectClass)\r\n      (JNIEnv *env, jobject obj);\r\n    jboolean (JNICALL *IsInstanceOf)\r\n      (JNIEnv *env, jobject obj, jclass clazz);\r\n\r\n    jmethodID (JNICALL *GetMethodID)\r\n      (JNIEnv *env, jclass clazz, const char *name, const char *sig);\r\n\r\n    jobject (JNICALL *CallObjectMethod)\r\n      (JNIEnv *env, jobject obj, jmethodID methodID, ...);\r\n    jobject (JNICALL *CallObjectMethodV)\r\n      (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);\r\n    jobject (JNICALL *CallObjectMethodA)\r\n      (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue * args);\r\n\r\n    jboolean (JNICALL *CallBooleanMethod)\r\n      (JNIEnv *env, jobject obj, jmethodID methodID, ...);\r\n    jboolean (JNICALL *CallBooleanMethodV)\r\n      (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);\r\n    jboolean (JNICALL *CallBooleanMethodA)\r\n      (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue * args);\r\n\r\n    jbyte (JNICALL *CallByteMethod)\r\n      (JNIEnv *env, jobject obj, jmethodID methodID, ...);\r\n    jbyte (JNICALL *CallByteMethodV)\r\n      (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);\r\n    jbyte (JNICALL *CallByteMethodA)\r\n      (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args);\r\n\r\n    jchar (JNICALL *CallCharMethod)\r\n      (JNIEnv *env, jobject obj, jmethodID methodID, ...);\r\n    jchar (JNICALL *CallCharMethodV)\r\n      (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);\r\n    jchar (JNICALL *CallCharMethodA)\r\n      (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args);\r\n\r\n    jshort (JNICALL *CallShortMethod)\r\n      (JNIEnv *env, jobject obj, jmethodID methodID, ...);\r\n    jshort (JNICALL *CallShortMethodV)\r\n      (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);\r\n    jshort (JNICALL *CallShortMethodA)\r\n      (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args);\r\n\r\n    jint (JNICALL *CallIntMethod)\r\n      (JNIEnv *env, jobject obj, jmethodID methodID, ...);\r\n    jint (JNICALL *CallIntMethodV)\r\n      (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);\r\n    jint (JNICALL *CallIntMethodA)\r\n      (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args);\r\n\r\n    jlong (JNICALL *CallLongMethod)\r\n      (JNIEnv *env, jobject obj, jmethodID methodID, ...);\r\n    jlong (JNICALL *CallLongMethodV)\r\n      (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);\r\n    jlong (JNICALL *CallLongMethodA)\r\n      (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args);\r\n\r\n    jfloat (JNICALL *CallFloatMethod)\r\n      (JNIEnv *env, jobject obj, jmethodID methodID, ...);\r\n    jfloat (JNICALL *CallFloatMethodV)\r\n      (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);\r\n    jfloat (JNICALL *CallFloatMethodA)\r\n      (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args);\r\n\r\n    jdouble (JNICALL *CallDoubleMethod)\r\n      (JNIEnv *env, jobject obj, jmethodID methodID, ...);\r\n    jdouble (JNICALL *CallDoubleMethodV)\r\n      (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);\r\n    jdouble (JNICALL *CallDoubleMethodA)\r\n      (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args);\r\n\r\n    void (JNICALL *CallVoidMethod)\r\n      (JNIEnv *env, jobject obj, jmethodID methodID, ...);\r\n    void (JNICALL *CallVoidMethodV)\r\n      (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);\r\n    void (JNICALL *CallVoidMethodA)\r\n      (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue * args);\r\n\r\n    jobject (JNICALL *CallNonvirtualObjectMethod)\r\n      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);\r\n    jobject (JNICALL *CallNonvirtualObjectMethodV)\r\n      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,\r\n       va_list args);\r\n    jobject (JNICALL *CallNonvirtualObjectMethodA)\r\n      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,\r\n       const jvalue * args);\r\n\r\n    jboolean (JNICALL *CallNonvirtualBooleanMethod)\r\n      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);\r\n    jboolean (JNICALL *CallNonvirtualBooleanMethodV)\r\n      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,\r\n       va_list args);\r\n    jboolean (JNICALL *CallNonvirtualBooleanMethodA)\r\n      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,\r\n       const jvalue * args);\r\n\r\n    jbyte (JNICALL *CallNonvirtualByteMethod)\r\n      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);\r\n    jbyte (JNICALL *CallNonvirtualByteMethodV)\r\n      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,\r\n       va_list args);\r\n    jbyte (JNICALL *CallNonvirtualByteMethodA)\r\n      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,\r\n       const jvalue *args);\r\n\r\n    jchar (JNICALL *CallNonvirtualCharMethod)\r\n      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);\r\n    jchar (JNICALL *CallNonvirtualCharMethodV)\r\n      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,\r\n       va_list args);\r\n    jchar (JNICALL *CallNonvirtualCharMethodA)\r\n      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,\r\n       const jvalue *args);\r\n\r\n    jshort (JNICALL *CallNonvirtualShortMethod)\r\n      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);\r\n    jshort (JNICALL *CallNonvirtualShortMethodV)\r\n      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,\r\n       va_list args);\r\n    jshort (JNICALL *CallNonvirtualShortMethodA)\r\n      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,\r\n       const jvalue *args);\r\n\r\n    jint (JNICALL *CallNonvirtualIntMethod)\r\n      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);\r\n    jint (JNICALL *CallNonvirtualIntMethodV)\r\n      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,\r\n       va_list args);\r\n    jint (JNICALL *CallNonvirtualIntMethodA)\r\n      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,\r\n       const jvalue *args);\r\n\r\n    jlong (JNICALL *CallNonvirtualLongMethod)\r\n      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);\r\n    jlong (JNICALL *CallNonvirtualLongMethodV)\r\n      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,\r\n       va_list args);\r\n    jlong (JNICALL *CallNonvirtualLongMethodA)\r\n      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,\r\n       const jvalue *args);\r\n\r\n    jfloat (JNICALL *CallNonvirtualFloatMethod)\r\n      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);\r\n    jfloat (JNICALL *CallNonvirtualFloatMethodV)\r\n      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,\r\n       va_list args);\r\n    jfloat (JNICALL *CallNonvirtualFloatMethodA)\r\n      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,\r\n       const jvalue *args);\r\n\r\n    jdouble (JNICALL *CallNonvirtualDoubleMethod)\r\n      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);\r\n    jdouble (JNICALL *CallNonvirtualDoubleMethodV)\r\n      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,\r\n       va_list args);\r\n    jdouble (JNICALL *CallNonvirtualDoubleMethodA)\r\n      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,\r\n       const jvalue *args);\r\n\r\n    void (JNICALL *CallNonvirtualVoidMethod)\r\n      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);\r\n    void (JNICALL *CallNonvirtualVoidMethodV)\r\n      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,\r\n       va_list args);\r\n    void (JNICALL *CallNonvirtualVoidMethodA)\r\n      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,\r\n       const jvalue * args);\r\n\r\n    jfieldID (JNICALL *GetFieldID)\r\n      (JNIEnv *env, jclass clazz, const char *name, const char *sig);\r\n\r\n    jobject (JNICALL *GetObjectField)\r\n      (JNIEnv *env, jobject obj, jfieldID fieldID);\r\n    jboolean (JNICALL *GetBooleanField)\r\n      (JNIEnv *env, jobject obj, jfieldID fieldID);\r\n    jbyte (JNICALL *GetByteField)\r\n      (JNIEnv *env, jobject obj, jfieldID fieldID);\r\n    jchar (JNICALL *GetCharField)\r\n      (JNIEnv *env, jobject obj, jfieldID fieldID);\r\n    jshort (JNICALL *GetShortField)\r\n      (JNIEnv *env, jobject obj, jfieldID fieldID);\r\n    jint (JNICALL *GetIntField)\r\n      (JNIEnv *env, jobject obj, jfieldID fieldID);\r\n    jlong (JNICALL *GetLongField)\r\n      (JNIEnv *env, jobject obj, jfieldID fieldID);\r\n    jfloat (JNICALL *GetFloatField)\r\n      (JNIEnv *env, jobject obj, jfieldID fieldID);\r\n    jdouble (JNICALL *GetDoubleField)\r\n      (JNIEnv *env, jobject obj, jfieldID fieldID);\r\n\r\n    void (JNICALL *SetObjectField)\r\n      (JNIEnv *env, jobject obj, jfieldID fieldID, jobject val);\r\n    void (JNICALL *SetBooleanField)\r\n      (JNIEnv *env, jobject obj, jfieldID fieldID, jboolean val);\r\n    void (JNICALL *SetByteField)\r\n      (JNIEnv *env, jobject obj, jfieldID fieldID, jbyte val);\r\n    void (JNICALL *SetCharField)\r\n      (JNIEnv *env, jobject obj, jfieldID fieldID, jchar val);\r\n    void (JNICALL *SetShortField)\r\n      (JNIEnv *env, jobject obj, jfieldID fieldID, jshort val);\r\n    void (JNICALL *SetIntField)\r\n      (JNIEnv *env, jobject obj, jfieldID fieldID, jint val);\r\n    void (JNICALL *SetLongField)\r\n      (JNIEnv *env, jobject obj, jfieldID fieldID, jlong val);\r\n    void (JNICALL *SetFloatField)\r\n      (JNIEnv *env, jobject obj, jfieldID fieldID, jfloat val);\r\n    void (JNICALL *SetDoubleField)\r\n      (JNIEnv *env, jobject obj, jfieldID fieldID, jdouble val);\r\n\r\n    jmethodID (JNICALL *GetStaticMethodID)\r\n      (JNIEnv *env, jclass clazz, const char *name, const char *sig);\r\n\r\n    jobject (JNICALL *CallStaticObjectMethod)\r\n      (JNIEnv *env, jclass clazz, jmethodID methodID, ...);\r\n    jobject (JNICALL *CallStaticObjectMethodV)\r\n      (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);\r\n    jobject (JNICALL *CallStaticObjectMethodA)\r\n      (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args);\r\n\r\n    jboolean (JNICALL *CallStaticBooleanMethod)\r\n      (JNIEnv *env, jclass clazz, jmethodID methodID, ...);\r\n    jboolean (JNICALL *CallStaticBooleanMethodV)\r\n      (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);\r\n    jboolean (JNICALL *CallStaticBooleanMethodA)\r\n      (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args);\r\n\r\n    jbyte (JNICALL *CallStaticByteMethod)\r\n      (JNIEnv *env, jclass clazz, jmethodID methodID, ...);\r\n    jbyte (JNICALL *CallStaticByteMethodV)\r\n      (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);\r\n    jbyte (JNICALL *CallStaticByteMethodA)\r\n      (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args);\r\n\r\n    jchar (JNICALL *CallStaticCharMethod)\r\n      (JNIEnv *env, jclass clazz, jmethodID methodID, ...);\r\n    jchar (JNICALL *CallStaticCharMethodV)\r\n      (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);\r\n    jchar (JNICALL *CallStaticCharMethodA)\r\n      (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args);\r\n\r\n    jshort (JNICALL *CallStaticShortMethod)\r\n      (JNIEnv *env, jclass clazz, jmethodID methodID, ...);\r\n    jshort (JNICALL *CallStaticShortMethodV)\r\n      (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);\r\n    jshort (JNICALL *CallStaticShortMethodA)\r\n      (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args);\r\n\r\n    jint (JNICALL *CallStaticIntMethod)\r\n      (JNIEnv *env, jclass clazz, jmethodID methodID, ...);\r\n    jint (JNICALL *CallStaticIntMethodV)\r\n      (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);\r\n    jint (JNICALL *CallStaticIntMethodA)\r\n      (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args);\r\n\r\n    jlong (JNICALL *CallStaticLongMethod)\r\n      (JNIEnv *env, jclass clazz, jmethodID methodID, ...);\r\n    jlong (JNICALL *CallStaticLongMethodV)\r\n      (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);\r\n    jlong (JNICALL *CallStaticLongMethodA)\r\n      (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args);\r\n\r\n    jfloat (JNICALL *CallStaticFloatMethod)\r\n      (JNIEnv *env, jclass clazz, jmethodID methodID, ...);\r\n    jfloat (JNICALL *CallStaticFloatMethodV)\r\n      (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);\r\n    jfloat (JNICALL *CallStaticFloatMethodA)\r\n      (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args);\r\n\r\n    jdouble (JNICALL *CallStaticDoubleMethod)\r\n      (JNIEnv *env, jclass clazz, jmethodID methodID, ...);\r\n    jdouble (JNICALL *CallStaticDoubleMethodV)\r\n      (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);\r\n    jdouble (JNICALL *CallStaticDoubleMethodA)\r\n      (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args);\r\n\r\n    void (JNICALL *CallStaticVoidMethod)\r\n      (JNIEnv *env, jclass cls, jmethodID methodID, ...);\r\n    void (JNICALL *CallStaticVoidMethodV)\r\n      (JNIEnv *env, jclass cls, jmethodID methodID, va_list args);\r\n    void (JNICALL *CallStaticVoidMethodA)\r\n      (JNIEnv *env, jclass cls, jmethodID methodID, const jvalue * args);\r\n\r\n    jfieldID (JNICALL *GetStaticFieldID)\r\n      (JNIEnv *env, jclass clazz, const char *name, const char *sig);\r\n    jobject (JNICALL *GetStaticObjectField)\r\n      (JNIEnv *env, jclass clazz, jfieldID fieldID);\r\n    jboolean (JNICALL *GetStaticBooleanField)\r\n      (JNIEnv *env, jclass clazz, jfieldID fieldID);\r\n    jbyte (JNICALL *GetStaticByteField)\r\n      (JNIEnv *env, jclass clazz, jfieldID fieldID);\r\n    jchar (JNICALL *GetStaticCharField)\r\n      (JNIEnv *env, jclass clazz, jfieldID fieldID);\r\n    jshort (JNICALL *GetStaticShortField)\r\n      (JNIEnv *env, jclass clazz, jfieldID fieldID);\r\n    jint (JNICALL *GetStaticIntField)\r\n      (JNIEnv *env, jclass clazz, jfieldID fieldID);\r\n    jlong (JNICALL *GetStaticLongField)\r\n      (JNIEnv *env, jclass clazz, jfieldID fieldID);\r\n    jfloat (JNICALL *GetStaticFloatField)\r\n      (JNIEnv *env, jclass clazz, jfieldID fieldID);\r\n    jdouble (JNICALL *GetStaticDoubleField)\r\n      (JNIEnv *env, jclass clazz, jfieldID fieldID);\r\n\r\n    void (JNICALL *SetStaticObjectField)\r\n      (JNIEnv *env, jclass clazz, jfieldID fieldID, jobject value);\r\n    void (JNICALL *SetStaticBooleanField)\r\n      (JNIEnv *env, jclass clazz, jfieldID fieldID, jboolean value);\r\n    void (JNICALL *SetStaticByteField)\r\n      (JNIEnv *env, jclass clazz, jfieldID fieldID, jbyte value);\r\n    void (JNICALL *SetStaticCharField)\r\n      (JNIEnv *env, jclass clazz, jfieldID fieldID, jchar value);\r\n    void (JNICALL *SetStaticShortField)\r\n      (JNIEnv *env, jclass clazz, jfieldID fieldID, jshort value);\r\n    void (JNICALL *SetStaticIntField)\r\n      (JNIEnv *env, jclass clazz, jfieldID fieldID, jint value);\r\n    void (JNICALL *SetStaticLongField)\r\n      (JNIEnv *env, jclass clazz, jfieldID fieldID, jlong value);\r\n    void (JNICALL *SetStaticFloatField)\r\n      (JNIEnv *env, jclass clazz, jfieldID fieldID, jfloat value);\r\n    void (JNICALL *SetStaticDoubleField)\r\n      (JNIEnv *env, jclass clazz, jfieldID fieldID, jdouble value);\r\n\r\n    jstring (JNICALL *NewString)\r\n      (JNIEnv *env, const jchar *unicode, jsize len);\r\n    jsize (JNICALL *GetStringLength)\r\n      (JNIEnv *env, jstring str);\r\n    const jchar *(JNICALL *GetStringChars)\r\n      (JNIEnv *env, jstring str, jboolean *isCopy);\r\n    void (JNICALL *ReleaseStringChars)\r\n      (JNIEnv *env, jstring str, const jchar *chars);\r\n\r\n    jstring (JNICALL *NewStringUTF)\r\n      (JNIEnv *env, const char *utf);\r\n    jsize (JNICALL *GetStringUTFLength)\r\n      (JNIEnv *env, jstring str);\r\n    const char* (JNICALL *GetStringUTFChars)\r\n      (JNIEnv *env, jstring str, jboolean *isCopy);\r\n    void (JNICALL *ReleaseStringUTFChars)\r\n      (JNIEnv *env, jstring str, const char* chars);\r\n\r\n\r\n    jsize (JNICALL *GetArrayLength)\r\n      (JNIEnv *env, jarray array);\r\n\r\n    jobjectArray (JNICALL *NewObjectArray)\r\n      (JNIEnv *env, jsize len, jclass clazz, jobject init);\r\n    jobject (JNICALL *GetObjectArrayElement)\r\n      (JNIEnv *env, jobjectArray array, jsize index);\r\n    void (JNICALL *SetObjectArrayElement)\r\n      (JNIEnv *env, jobjectArray array, jsize index, jobject val);\r\n\r\n    jbooleanArray (JNICALL *NewBooleanArray)\r\n      (JNIEnv *env, jsize len);\r\n    jbyteArray (JNICALL *NewByteArray)\r\n      (JNIEnv *env, jsize len);\r\n    jcharArray (JNICALL *NewCharArray)\r\n      (JNIEnv *env, jsize len);\r\n    jshortArray (JNICALL *NewShortArray)\r\n      (JNIEnv *env, jsize len);\r\n    jintArray (JNICALL *NewIntArray)\r\n      (JNIEnv *env, jsize len);\r\n    jlongArray (JNICALL *NewLongArray)\r\n      (JNIEnv *env, jsize len);\r\n    jfloatArray (JNICALL *NewFloatArray)\r\n      (JNIEnv *env, jsize len);\r\n    jdoubleArray (JNICALL *NewDoubleArray)\r\n      (JNIEnv *env, jsize len);\r\n\r\n    jboolean * (JNICALL *GetBooleanArrayElements)\r\n      (JNIEnv *env, jbooleanArray array, jboolean *isCopy);\r\n    jbyte * (JNICALL *GetByteArrayElements)\r\n      (JNIEnv *env, jbyteArray array, jboolean *isCopy);\r\n    jchar * (JNICALL *GetCharArrayElements)\r\n      (JNIEnv *env, jcharArray array, jboolean *isCopy);\r\n    jshort * (JNICALL *GetShortArrayElements)\r\n      (JNIEnv *env, jshortArray array, jboolean *isCopy);\r\n    jint * (JNICALL *GetIntArrayElements)\r\n      (JNIEnv *env, jintArray array, jboolean *isCopy);\r\n    jlong * (JNICALL *GetLongArrayElements)\r\n      (JNIEnv *env, jlongArray array, jboolean *isCopy);\r\n    jfloat * (JNICALL *GetFloatArrayElements)\r\n      (JNIEnv *env, jfloatArray array, jboolean *isCopy);\r\n    jdouble * (JNICALL *GetDoubleArrayElements)\r\n      (JNIEnv *env, jdoubleArray array, jboolean *isCopy);\r\n\r\n    void (JNICALL *ReleaseBooleanArrayElements)\r\n      (JNIEnv *env, jbooleanArray array, jboolean *elems, jint mode);\r\n    void (JNICALL *ReleaseByteArrayElements)\r\n      (JNIEnv *env, jbyteArray array, jbyte *elems, jint mode);\r\n    void (JNICALL *ReleaseCharArrayElements)\r\n      (JNIEnv *env, jcharArray array, jchar *elems, jint mode);\r\n    void (JNICALL *ReleaseShortArrayElements)\r\n      (JNIEnv *env, jshortArray array, jshort *elems, jint mode);\r\n    void (JNICALL *ReleaseIntArrayElements)\r\n      (JNIEnv *env, jintArray array, jint *elems, jint mode);\r\n    void (JNICALL *ReleaseLongArrayElements)\r\n      (JNIEnv *env, jlongArray array, jlong *elems, jint mode);\r\n    void (JNICALL *ReleaseFloatArrayElements)\r\n      (JNIEnv *env, jfloatArray array, jfloat *elems, jint mode);\r\n    void (JNICALL *ReleaseDoubleArrayElements)\r\n      (JNIEnv *env, jdoubleArray array, jdouble *elems, jint mode);\r\n\r\n    void (JNICALL *GetBooleanArrayRegion)\r\n      (JNIEnv *env, jbooleanArray array, jsize start, jsize l, jboolean *buf);\r\n    void (JNICALL *GetByteArrayRegion)\r\n      (JNIEnv *env, jbyteArray array, jsize start, jsize len, jbyte *buf);\r\n    void (JNICALL *GetCharArrayRegion)\r\n      (JNIEnv *env, jcharArray array, jsize start, jsize len, jchar *buf);\r\n    void (JNICALL *GetShortArrayRegion)\r\n      (JNIEnv *env, jshortArray array, jsize start, jsize len, jshort *buf);\r\n    void (JNICALL *GetIntArrayRegion)\r\n      (JNIEnv *env, jintArray array, jsize start, jsize len, jint *buf);\r\n    void (JNICALL *GetLongArrayRegion)\r\n      (JNIEnv *env, jlongArray array, jsize start, jsize len, jlong *buf);\r\n    void (JNICALL *GetFloatArrayRegion)\r\n      (JNIEnv *env, jfloatArray array, jsize start, jsize len, jfloat *buf);\r\n    void (JNICALL *GetDoubleArrayRegion)\r\n      (JNIEnv *env, jdoubleArray array, jsize start, jsize len, jdouble *buf);\r\n\r\n    void (JNICALL *SetBooleanArrayRegion)\r\n      (JNIEnv *env, jbooleanArray array, jsize start, jsize l, const jboolean *buf);\r\n    void (JNICALL *SetByteArrayRegion)\r\n      (JNIEnv *env, jbyteArray array, jsize start, jsize len, const jbyte *buf);\r\n    void (JNICALL *SetCharArrayRegion)\r\n      (JNIEnv *env, jcharArray array, jsize start, jsize len, const jchar *buf);\r\n    void (JNICALL *SetShortArrayRegion)\r\n      (JNIEnv *env, jshortArray array, jsize start, jsize len, const jshort *buf);\r\n    void (JNICALL *SetIntArrayRegion)\r\n      (JNIEnv *env, jintArray array, jsize start, jsize len, const jint *buf);\r\n    void (JNICALL *SetLongArrayRegion)\r\n      (JNIEnv *env, jlongArray array, jsize start, jsize len, const jlong *buf);\r\n    void (JNICALL *SetFloatArrayRegion)\r\n      (JNIEnv *env, jfloatArray array, jsize start, jsize len, const jfloat *buf);\r\n    void (JNICALL *SetDoubleArrayRegion)\r\n      (JNIEnv *env, jdoubleArray array, jsize start, jsize len, const jdouble *buf);\r\n\r\n    jint (JNICALL *RegisterNatives)\r\n      (JNIEnv *env, jclass clazz, const JNINativeMethod *methods,\r\n       jint nMethods);\r\n    jint (JNICALL *UnregisterNatives)\r\n      (JNIEnv *env, jclass clazz);\r\n\r\n    jint (JNICALL *MonitorEnter)\r\n      (JNIEnv *env, jobject obj);\r\n    jint (JNICALL *MonitorExit)\r\n      (JNIEnv *env, jobject obj);\r\n\r\n    jint (JNICALL *GetJavaVM)\r\n      (JNIEnv *env, JavaVM **vm);\r\n\r\n    void (JNICALL *GetStringRegion)\r\n      (JNIEnv *env, jstring str, jsize start, jsize len, jchar *buf);\r\n    void (JNICALL *GetStringUTFRegion)\r\n      (JNIEnv *env, jstring str, jsize start, jsize len, char *buf);\r\n\r\n    void * (JNICALL *GetPrimitiveArrayCritical)\r\n      (JNIEnv *env, jarray array, jboolean *isCopy);\r\n    void (JNICALL *ReleasePrimitiveArrayCritical)\r\n      (JNIEnv *env, jarray array, void *carray, jint mode);\r\n\r\n    const jchar * (JNICALL *GetStringCritical)\r\n      (JNIEnv *env, jstring string, jboolean *isCopy);\r\n    void (JNICALL *ReleaseStringCritical)\r\n      (JNIEnv *env, jstring string, const jchar *cstring);\r\n\r\n    jweak (JNICALL *NewWeakGlobalRef)\r\n       (JNIEnv *env, jobject obj);\r\n    void (JNICALL *DeleteWeakGlobalRef)\r\n       (JNIEnv *env, jweak ref);\r\n\r\n    jboolean (JNICALL *ExceptionCheck)\r\n       (JNIEnv *env);\r\n\r\n    jobject (JNICALL *NewDirectByteBuffer)\r\n       (JNIEnv* env, void* address, jlong capacity);\r\n    void* (JNICALL *GetDirectBufferAddress)\r\n       (JNIEnv* env, jobject buf);\r\n    jlong (JNICALL *GetDirectBufferCapacity)\r\n       (JNIEnv* env, jobject buf);\r\n\r\n    /* New JNI 1.6 Features */\r\n\r\n    jobjectRefType (JNICALL *GetObjectRefType)\r\n        (JNIEnv* env, jobject obj);\r\n};\r\n\r\n/*\r\n * We use inlined functions for C++ so that programmers can write:\r\n *\r\n *    env->FindClass(\"java/lang/String\")\r\n *\r\n * in C++ rather than:\r\n *\r\n *    (*env)->FindClass(env, \"java/lang/String\")\r\n *\r\n * in C.\r\n */\r\n\r\nstruct JNIEnv_ {\r\n    const struct JNINativeInterface_ *functions;\r\n#ifdef __cplusplus\r\n\r\n    jint GetVersion() {\r\n        return functions->GetVersion(this);\r\n    }\r\n    jclass DefineClass(const char *name, jobject loader, const jbyte *buf,\r\n                       jsize len) {\r\n        return functions->DefineClass(this, name, loader, buf, len);\r\n    }\r\n    jclass FindClass(const char *name) {\r\n        return functions->FindClass(this, name);\r\n    }\r\n    jmethodID FromReflectedMethod(jobject method) {\r\n        return functions->FromReflectedMethod(this,method);\r\n    }\r\n    jfieldID FromReflectedField(jobject field) {\r\n        return functions->FromReflectedField(this,field);\r\n    }\r\n\r\n    jobject ToReflectedMethod(jclass cls, jmethodID methodID, jboolean isStatic) {\r\n        return functions->ToReflectedMethod(this, cls, methodID, isStatic);\r\n    }\r\n\r\n    jclass GetSuperclass(jclass sub) {\r\n        return functions->GetSuperclass(this, sub);\r\n    }\r\n    jboolean IsAssignableFrom(jclass sub, jclass sup) {\r\n        return functions->IsAssignableFrom(this, sub, sup);\r\n    }\r\n\r\n    jobject ToReflectedField(jclass cls, jfieldID fieldID, jboolean isStatic) {\r\n        return functions->ToReflectedField(this,cls,fieldID,isStatic);\r\n    }\r\n\r\n    jint Throw(jthrowable obj) {\r\n        return functions->Throw(this, obj);\r\n    }\r\n    jint ThrowNew(jclass clazz, const char *msg) {\r\n        return functions->ThrowNew(this, clazz, msg);\r\n    }\r\n    jthrowable ExceptionOccurred() {\r\n        return functions->ExceptionOccurred(this);\r\n    }\r\n    void ExceptionDescribe() {\r\n        functions->ExceptionDescribe(this);\r\n    }\r\n    void ExceptionClear() {\r\n        functions->ExceptionClear(this);\r\n    }\r\n    void FatalError(const char *msg) {\r\n        functions->FatalError(this, msg);\r\n    }\r\n\r\n    jint PushLocalFrame(jint capacity) {\r\n        return functions->PushLocalFrame(this,capacity);\r\n    }\r\n    jobject PopLocalFrame(jobject result) {\r\n        return functions->PopLocalFrame(this,result);\r\n    }\r\n\r\n    jobject NewGlobalRef(jobject lobj) {\r\n        return functions->NewGlobalRef(this,lobj);\r\n    }\r\n    void DeleteGlobalRef(jobject gref) {\r\n        functions->DeleteGlobalRef(this,gref);\r\n    }\r\n    void DeleteLocalRef(jobject obj) {\r\n        functions->DeleteLocalRef(this, obj);\r\n    }\r\n\r\n    jboolean IsSameObject(jobject obj1, jobject obj2) {\r\n        return functions->IsSameObject(this,obj1,obj2);\r\n    }\r\n\r\n    jobject NewLocalRef(jobject ref) {\r\n        return functions->NewLocalRef(this,ref);\r\n    }\r\n    jint EnsureLocalCapacity(jint capacity) {\r\n        return functions->EnsureLocalCapacity(this,capacity);\r\n    }\r\n\r\n    jobject AllocObject(jclass clazz) {\r\n        return functions->AllocObject(this,clazz);\r\n    }\r\n    jobject NewObject(jclass clazz, jmethodID methodID, ...) {\r\n        va_list args;\r\n        jobject result;\r\n        va_start(args, methodID);\r\n        result = functions->NewObjectV(this,clazz,methodID,args);\r\n        va_end(args);\r\n        return result;\r\n    }\r\n    jobject NewObjectV(jclass clazz, jmethodID methodID,\r\n                       va_list args) {\r\n        return functions->NewObjectV(this,clazz,methodID,args);\r\n    }\r\n    jobject NewObjectA(jclass clazz, jmethodID methodID,\r\n                       const jvalue *args) {\r\n        return functions->NewObjectA(this,clazz,methodID,args);\r\n    }\r\n\r\n    jclass GetObjectClass(jobject obj) {\r\n        return functions->GetObjectClass(this,obj);\r\n    }\r\n    jboolean IsInstanceOf(jobject obj, jclass clazz) {\r\n        return functions->IsInstanceOf(this,obj,clazz);\r\n    }\r\n\r\n    jmethodID GetMethodID(jclass clazz, const char *name,\r\n                          const char *sig) {\r\n        return functions->GetMethodID(this,clazz,name,sig);\r\n    }\r\n\r\n    jobject CallObjectMethod(jobject obj, jmethodID methodID, ...) {\r\n        va_list args;\r\n        jobject result;\r\n        va_start(args,methodID);\r\n        result = functions->CallObjectMethodV(this,obj,methodID,args);\r\n        va_end(args);\r\n        return result;\r\n    }\r\n    jobject CallObjectMethodV(jobject obj, jmethodID methodID,\r\n                        va_list args) {\r\n        return functions->CallObjectMethodV(this,obj,methodID,args);\r\n    }\r\n    jobject CallObjectMethodA(jobject obj, jmethodID methodID,\r\n                        const jvalue * args) {\r\n        return functions->CallObjectMethodA(this,obj,methodID,args);\r\n    }\r\n\r\n    jboolean CallBooleanMethod(jobject obj,\r\n                               jmethodID methodID, ...) {\r\n        va_list args;\r\n        jboolean result;\r\n        va_start(args,methodID);\r\n        result = functions->CallBooleanMethodV(this,obj,methodID,args);\r\n        va_end(args);\r\n        return result;\r\n    }\r\n    jboolean CallBooleanMethodV(jobject obj, jmethodID methodID,\r\n                                va_list args) {\r\n        return functions->CallBooleanMethodV(this,obj,methodID,args);\r\n    }\r\n    jboolean CallBooleanMethodA(jobject obj, jmethodID methodID,\r\n                                const jvalue * args) {\r\n        return functions->CallBooleanMethodA(this,obj,methodID, args);\r\n    }\r\n\r\n    jbyte CallByteMethod(jobject obj, jmethodID methodID, ...) {\r\n        va_list args;\r\n        jbyte result;\r\n        va_start(args,methodID);\r\n        result = functions->CallByteMethodV(this,obj,methodID,args);\r\n        va_end(args);\r\n        return result;\r\n    }\r\n    jbyte CallByteMethodV(jobject obj, jmethodID methodID,\r\n                          va_list args) {\r\n        return functions->CallByteMethodV(this,obj,methodID,args);\r\n    }\r\n    jbyte CallByteMethodA(jobject obj, jmethodID methodID,\r\n                          const jvalue * args) {\r\n        return functions->CallByteMethodA(this,obj,methodID,args);\r\n    }\r\n\r\n    jchar CallCharMethod(jobject obj, jmethodID methodID, ...) {\r\n        va_list args;\r\n        jchar result;\r\n        va_start(args,methodID);\r\n        result = functions->CallCharMethodV(this,obj,methodID,args);\r\n        va_end(args);\r\n        return result;\r\n    }\r\n    jchar CallCharMethodV(jobject obj, jmethodID methodID,\r\n                          va_list args) {\r\n        return functions->CallCharMethodV(this,obj,methodID,args);\r\n    }\r\n    jchar CallCharMethodA(jobject obj, jmethodID methodID,\r\n                          const jvalue * args) {\r\n        return functions->CallCharMethodA(this,obj,methodID,args);\r\n    }\r\n\r\n    jshort CallShortMethod(jobject obj, jmethodID methodID, ...) {\r\n        va_list args;\r\n        jshort result;\r\n        va_start(args,methodID);\r\n        result = functions->CallShortMethodV(this,obj,methodID,args);\r\n        va_end(args);\r\n        return result;\r\n    }\r\n    jshort CallShortMethodV(jobject obj, jmethodID methodID,\r\n                            va_list args) {\r\n        return functions->CallShortMethodV(this,obj,methodID,args);\r\n    }\r\n    jshort CallShortMethodA(jobject obj, jmethodID methodID,\r\n                            const jvalue * args) {\r\n        return functions->CallShortMethodA(this,obj,methodID,args);\r\n    }\r\n\r\n    jint CallIntMethod(jobject obj, jmethodID methodID, ...) {\r\n        va_list args;\r\n        jint result;\r\n        va_start(args,methodID);\r\n        result = functions->CallIntMethodV(this,obj,methodID,args);\r\n        va_end(args);\r\n        return result;\r\n    }\r\n    jint CallIntMethodV(jobject obj, jmethodID methodID,\r\n                        va_list args) {\r\n        return functions->CallIntMethodV(this,obj,methodID,args);\r\n    }\r\n    jint CallIntMethodA(jobject obj, jmethodID methodID,\r\n                        const jvalue * args) {\r\n        return functions->CallIntMethodA(this,obj,methodID,args);\r\n    }\r\n\r\n    jlong CallLongMethod(jobject obj, jmethodID methodID, ...) {\r\n        va_list args;\r\n        jlong result;\r\n        va_start(args,methodID);\r\n        result = functions->CallLongMethodV(this,obj,methodID,args);\r\n        va_end(args);\r\n        return result;\r\n    }\r\n    jlong CallLongMethodV(jobject obj, jmethodID methodID,\r\n                          va_list args) {\r\n        return functions->CallLongMethodV(this,obj,methodID,args);\r\n    }\r\n    jlong CallLongMethodA(jobject obj, jmethodID methodID,\r\n                          const jvalue * args) {\r\n        return functions->CallLongMethodA(this,obj,methodID,args);\r\n    }\r\n\r\n    jfloat CallFloatMethod(jobject obj, jmethodID methodID, ...) {\r\n        va_list args;\r\n        jfloat result;\r\n        va_start(args,methodID);\r\n        result = functions->CallFloatMethodV(this,obj,methodID,args);\r\n        va_end(args);\r\n        return result;\r\n    }\r\n    jfloat CallFloatMethodV(jobject obj, jmethodID methodID,\r\n                            va_list args) {\r\n        return functions->CallFloatMethodV(this,obj,methodID,args);\r\n    }\r\n    jfloat CallFloatMethodA(jobject obj, jmethodID methodID,\r\n                            const jvalue * args) {\r\n        return functions->CallFloatMethodA(this,obj,methodID,args);\r\n    }\r\n\r\n    jdouble CallDoubleMethod(jobject obj, jmethodID methodID, ...) {\r\n        va_list args;\r\n        jdouble result;\r\n        va_start(args,methodID);\r\n        result = functions->CallDoubleMethodV(this,obj,methodID,args);\r\n        va_end(args);\r\n        return result;\r\n    }\r\n    jdouble CallDoubleMethodV(jobject obj, jmethodID methodID,\r\n                        va_list args) {\r\n        return functions->CallDoubleMethodV(this,obj,methodID,args);\r\n    }\r\n    jdouble CallDoubleMethodA(jobject obj, jmethodID methodID,\r\n                        const jvalue * args) {\r\n        return functions->CallDoubleMethodA(this,obj,methodID,args);\r\n    }\r\n\r\n    void CallVoidMethod(jobject obj, jmethodID methodID, ...) {\r\n        va_list args;\r\n        va_start(args,methodID);\r\n        functions->CallVoidMethodV(this,obj,methodID,args);\r\n        va_end(args);\r\n    }\r\n    void CallVoidMethodV(jobject obj, jmethodID methodID,\r\n                         va_list args) {\r\n        functions->CallVoidMethodV(this,obj,methodID,args);\r\n    }\r\n    void CallVoidMethodA(jobject obj, jmethodID methodID,\r\n                         const jvalue * args) {\r\n        functions->CallVoidMethodA(this,obj,methodID,args);\r\n    }\r\n\r\n    jobject CallNonvirtualObjectMethod(jobject obj, jclass clazz,\r\n                                       jmethodID methodID, ...) {\r\n        va_list args;\r\n        jobject result;\r\n        va_start(args,methodID);\r\n        result = functions->CallNonvirtualObjectMethodV(this,obj,clazz,\r\n                                                        methodID,args);\r\n        va_end(args);\r\n        return result;\r\n    }\r\n    jobject CallNonvirtualObjectMethodV(jobject obj, jclass clazz,\r\n                                        jmethodID methodID, va_list args) {\r\n        return functions->CallNonvirtualObjectMethodV(this,obj,clazz,\r\n                                                      methodID,args);\r\n    }\r\n    jobject CallNonvirtualObjectMethodA(jobject obj, jclass clazz,\r\n                                        jmethodID methodID, const jvalue * args) {\r\n        return functions->CallNonvirtualObjectMethodA(this,obj,clazz,\r\n                                                      methodID,args);\r\n    }\r\n\r\n    jboolean CallNonvirtualBooleanMethod(jobject obj, jclass clazz,\r\n                                         jmethodID methodID, ...) {\r\n        va_list args;\r\n        jboolean result;\r\n        va_start(args,methodID);\r\n        result = functions->CallNonvirtualBooleanMethodV(this,obj,clazz,\r\n                                                         methodID,args);\r\n        va_end(args);\r\n        return result;\r\n    }\r\n    jboolean CallNonvirtualBooleanMethodV(jobject obj, jclass clazz,\r\n                                          jmethodID methodID, va_list args) {\r\n        return functions->CallNonvirtualBooleanMethodV(this,obj,clazz,\r\n                                                       methodID,args);\r\n    }\r\n    jboolean CallNonvirtualBooleanMethodA(jobject obj, jclass clazz,\r\n                                          jmethodID methodID, const jvalue * args) {\r\n        return functions->CallNonvirtualBooleanMethodA(this,obj,clazz,\r\n                                                       methodID, args);\r\n    }\r\n\r\n    jbyte CallNonvirtualByteMethod(jobject obj, jclass clazz,\r\n                                   jmethodID methodID, ...) {\r\n        va_list args;\r\n        jbyte result;\r\n        va_start(args,methodID);\r\n        result = functions->CallNonvirtualByteMethodV(this,obj,clazz,\r\n                                                      methodID,args);\r\n        va_end(args);\r\n        return result;\r\n    }\r\n    jbyte CallNonvirtualByteMethodV(jobject obj, jclass clazz,\r\n                                    jmethodID methodID, va_list args) {\r\n        return functions->CallNonvirtualByteMethodV(this,obj,clazz,\r\n                                                    methodID,args);\r\n    }\r\n    jbyte CallNonvirtualByteMethodA(jobject obj, jclass clazz,\r\n                                    jmethodID methodID, const jvalue * args) {\r\n        return functions->CallNonvirtualByteMethodA(this,obj,clazz,\r\n                                                    methodID,args);\r\n    }\r\n\r\n    jchar CallNonvirtualCharMethod(jobject obj, jclass clazz,\r\n                                   jmethodID methodID, ...) {\r\n        va_list args;\r\n        jchar result;\r\n        va_start(args,methodID);\r\n        result = functions->CallNonvirtualCharMethodV(this,obj,clazz,\r\n                                                      methodID,args);\r\n        va_end(args);\r\n        return result;\r\n    }\r\n    jchar CallNonvirtualCharMethodV(jobject obj, jclass clazz,\r\n                                    jmethodID methodID, va_list args) {\r\n        return functions->CallNonvirtualCharMethodV(this,obj,clazz,\r\n                                                    methodID,args);\r\n    }\r\n    jchar CallNonvirtualCharMethodA(jobject obj, jclass clazz,\r\n                                    jmethodID methodID, const jvalue * args) {\r\n        return functions->CallNonvirtualCharMethodA(this,obj,clazz,\r\n                                                    methodID,args);\r\n    }\r\n\r\n    jshort CallNonvirtualShortMethod(jobject obj, jclass clazz,\r\n                                     jmethodID methodID, ...) {\r\n        va_list args;\r\n        jshort result;\r\n        va_start(args,methodID);\r\n        result = functions->CallNonvirtualShortMethodV(this,obj,clazz,\r\n                                                       methodID,args);\r\n        va_end(args);\r\n        return result;\r\n    }\r\n    jshort CallNonvirtualShortMethodV(jobject obj, jclass clazz,\r\n                                      jmethodID methodID, va_list args) {\r\n        return functions->CallNonvirtualShortMethodV(this,obj,clazz,\r\n                                                     methodID,args);\r\n    }\r\n    jshort CallNonvirtualShortMethodA(jobject obj, jclass clazz,\r\n                                      jmethodID methodID, const jvalue * args) {\r\n        return functions->CallNonvirtualShortMethodA(this,obj,clazz,\r\n                                                     methodID,args);\r\n    }\r\n\r\n    jint CallNonvirtualIntMethod(jobject obj, jclass clazz,\r\n                                 jmethodID methodID, ...) {\r\n        va_list args;\r\n        jint result;\r\n        va_start(args,methodID);\r\n        result = functions->CallNonvirtualIntMethodV(this,obj,clazz,\r\n                                                     methodID,args);\r\n        va_end(args);\r\n        return result;\r\n    }\r\n    jint CallNonvirtualIntMethodV(jobject obj, jclass clazz,\r\n                                  jmethodID methodID, va_list args) {\r\n        return functions->CallNonvirtualIntMethodV(this,obj,clazz,\r\n                                                   methodID,args);\r\n    }\r\n    jint CallNonvirtualIntMethodA(jobject obj, jclass clazz,\r\n                                  jmethodID methodID, const jvalue * args) {\r\n        return functions->CallNonvirtualIntMethodA(this,obj,clazz,\r\n                                                   methodID,args);\r\n    }\r\n\r\n    jlong CallNonvirtualLongMethod(jobject obj, jclass clazz,\r\n                                   jmethodID methodID, ...) {\r\n        va_list args;\r\n        jlong result;\r\n        va_start(args,methodID);\r\n        result = functions->CallNonvirtualLongMethodV(this,obj,clazz,\r\n                                                      methodID,args);\r\n        va_end(args);\r\n        return result;\r\n    }\r\n    jlong CallNonvirtualLongMethodV(jobject obj, jclass clazz,\r\n                                    jmethodID methodID, va_list args) {\r\n        return functions->CallNonvirtualLongMethodV(this,obj,clazz,\r\n                                                    methodID,args);\r\n    }\r\n    jlong CallNonvirtualLongMethodA(jobject obj, jclass clazz,\r\n                                    jmethodID methodID, const jvalue * args) {\r\n        return functions->CallNonvirtualLongMethodA(this,obj,clazz,\r\n                                                    methodID,args);\r\n    }\r\n\r\n    jfloat CallNonvirtualFloatMethod(jobject obj, jclass clazz,\r\n                                     jmethodID methodID, ...) {\r\n        va_list args;\r\n        jfloat result;\r\n        va_start(args,methodID);\r\n        result = functions->CallNonvirtualFloatMethodV(this,obj,clazz,\r\n                                                       methodID,args);\r\n        va_end(args);\r\n        return result;\r\n    }\r\n    jfloat CallNonvirtualFloatMethodV(jobject obj, jclass clazz,\r\n                                      jmethodID methodID,\r\n                                      va_list args) {\r\n        return functions->CallNonvirtualFloatMethodV(this,obj,clazz,\r\n                                                     methodID,args);\r\n    }\r\n    jfloat CallNonvirtualFloatMethodA(jobject obj, jclass clazz,\r\n                                      jmethodID methodID,\r\n                                      const jvalue * args) {\r\n        return functions->CallNonvirtualFloatMethodA(this,obj,clazz,\r\n                                                     methodID,args);\r\n    }\r\n\r\n    jdouble CallNonvirtualDoubleMethod(jobject obj, jclass clazz,\r\n                                       jmethodID methodID, ...) {\r\n        va_list args;\r\n        jdouble result;\r\n        va_start(args,methodID);\r\n        result = functions->CallNonvirtualDoubleMethodV(this,obj,clazz,\r\n                                                        methodID,args);\r\n        va_end(args);\r\n        return result;\r\n    }\r\n    jdouble CallNonvirtualDoubleMethodV(jobject obj, jclass clazz,\r\n                                        jmethodID methodID,\r\n                                        va_list args) {\r\n        return functions->CallNonvirtualDoubleMethodV(this,obj,clazz,\r\n                                                      methodID,args);\r\n    }\r\n    jdouble CallNonvirtualDoubleMethodA(jobject obj, jclass clazz,\r\n                                        jmethodID methodID,\r\n                                        const jvalue * args) {\r\n        return functions->CallNonvirtualDoubleMethodA(this,obj,clazz,\r\n                                                      methodID,args);\r\n    }\r\n\r\n    void CallNonvirtualVoidMethod(jobject obj, jclass clazz,\r\n                                  jmethodID methodID, ...) {\r\n        va_list args;\r\n        va_start(args,methodID);\r\n        functions->CallNonvirtualVoidMethodV(this,obj,clazz,methodID,args);\r\n        va_end(args);\r\n    }\r\n    void CallNonvirtualVoidMethodV(jobject obj, jclass clazz,\r\n                                   jmethodID methodID,\r\n                                   va_list args) {\r\n        functions->CallNonvirtualVoidMethodV(this,obj,clazz,methodID,args);\r\n    }\r\n    void CallNonvirtualVoidMethodA(jobject obj, jclass clazz,\r\n                                   jmethodID methodID,\r\n                                   const jvalue * args) {\r\n        functions->CallNonvirtualVoidMethodA(this,obj,clazz,methodID,args);\r\n    }\r\n\r\n    jfieldID GetFieldID(jclass clazz, const char *name,\r\n                        const char *sig) {\r\n        return functions->GetFieldID(this,clazz,name,sig);\r\n    }\r\n\r\n    jobject GetObjectField(jobject obj, jfieldID fieldID) {\r\n        return functions->GetObjectField(this,obj,fieldID);\r\n    }\r\n    jboolean GetBooleanField(jobject obj, jfieldID fieldID) {\r\n        return functions->GetBooleanField(this,obj,fieldID);\r\n    }\r\n    jbyte GetByteField(jobject obj, jfieldID fieldID) {\r\n        return functions->GetByteField(this,obj,fieldID);\r\n    }\r\n    jchar GetCharField(jobject obj, jfieldID fieldID) {\r\n        return functions->GetCharField(this,obj,fieldID);\r\n    }\r\n    jshort GetShortField(jobject obj, jfieldID fieldID) {\r\n        return functions->GetShortField(this,obj,fieldID);\r\n    }\r\n    jint GetIntField(jobject obj, jfieldID fieldID) {\r\n        return functions->GetIntField(this,obj,fieldID);\r\n    }\r\n    jlong GetLongField(jobject obj, jfieldID fieldID) {\r\n        return functions->GetLongField(this,obj,fieldID);\r\n    }\r\n    jfloat GetFloatField(jobject obj, jfieldID fieldID) {\r\n        return functions->GetFloatField(this,obj,fieldID);\r\n    }\r\n    jdouble GetDoubleField(jobject obj, jfieldID fieldID) {\r\n        return functions->GetDoubleField(this,obj,fieldID);\r\n    }\r\n\r\n    void SetObjectField(jobject obj, jfieldID fieldID, jobject val) {\r\n        functions->SetObjectField(this,obj,fieldID,val);\r\n    }\r\n    void SetBooleanField(jobject obj, jfieldID fieldID,\r\n                         jboolean val) {\r\n        functions->SetBooleanField(this,obj,fieldID,val);\r\n    }\r\n    void SetByteField(jobject obj, jfieldID fieldID,\r\n                      jbyte val) {\r\n        functions->SetByteField(this,obj,fieldID,val);\r\n    }\r\n    void SetCharField(jobject obj, jfieldID fieldID,\r\n                      jchar val) {\r\n        functions->SetCharField(this,obj,fieldID,val);\r\n    }\r\n    void SetShortField(jobject obj, jfieldID fieldID,\r\n                       jshort val) {\r\n        functions->SetShortField(this,obj,fieldID,val);\r\n    }\r\n    void SetIntField(jobject obj, jfieldID fieldID,\r\n                     jint val) {\r\n        functions->SetIntField(this,obj,fieldID,val);\r\n    }\r\n    void SetLongField(jobject obj, jfieldID fieldID,\r\n                      jlong val) {\r\n        functions->SetLongField(this,obj,fieldID,val);\r\n    }\r\n    void SetFloatField(jobject obj, jfieldID fieldID,\r\n                       jfloat val) {\r\n        functions->SetFloatField(this,obj,fieldID,val);\r\n    }\r\n    void SetDoubleField(jobject obj, jfieldID fieldID,\r\n                        jdouble val) {\r\n        functions->SetDoubleField(this,obj,fieldID,val);\r\n    }\r\n\r\n    jmethodID GetStaticMethodID(jclass clazz, const char *name,\r\n                                const char *sig) {\r\n        return functions->GetStaticMethodID(this,clazz,name,sig);\r\n    }\r\n\r\n    jobject CallStaticObjectMethod(jclass clazz, jmethodID methodID,\r\n                             ...) {\r\n        va_list args;\r\n        jobject result;\r\n        va_start(args,methodID);\r\n        result = functions->CallStaticObjectMethodV(this,clazz,methodID,args);\r\n        va_end(args);\r\n        return result;\r\n    }\r\n    jobject CallStaticObjectMethodV(jclass clazz, jmethodID methodID,\r\n                              va_list args) {\r\n        return functions->CallStaticObjectMethodV(this,clazz,methodID,args);\r\n    }\r\n    jobject CallStaticObjectMethodA(jclass clazz, jmethodID methodID,\r\n                              const jvalue *args) {\r\n        return functions->CallStaticObjectMethodA(this,clazz,methodID,args);\r\n    }\r\n\r\n    jboolean CallStaticBooleanMethod(jclass clazz,\r\n                                     jmethodID methodID, ...) {\r\n        va_list args;\r\n        jboolean result;\r\n        va_start(args,methodID);\r\n        result = functions->CallStaticBooleanMethodV(this,clazz,methodID,args);\r\n        va_end(args);\r\n        return result;\r\n    }\r\n    jboolean CallStaticBooleanMethodV(jclass clazz,\r\n                                      jmethodID methodID, va_list args) {\r\n        return functions->CallStaticBooleanMethodV(this,clazz,methodID,args);\r\n    }\r\n    jboolean CallStaticBooleanMethodA(jclass clazz,\r\n                                      jmethodID methodID, const jvalue *args) {\r\n        return functions->CallStaticBooleanMethodA(this,clazz,methodID,args);\r\n    }\r\n\r\n    jbyte CallStaticByteMethod(jclass clazz,\r\n                               jmethodID methodID, ...) {\r\n        va_list args;\r\n        jbyte result;\r\n        va_start(args,methodID);\r\n        result = functions->CallStaticByteMethodV(this,clazz,methodID,args);\r\n        va_end(args);\r\n        return result;\r\n    }\r\n    jbyte CallStaticByteMethodV(jclass clazz,\r\n                                jmethodID methodID, va_list args) {\r\n        return functions->CallStaticByteMethodV(this,clazz,methodID,args);\r\n    }\r\n    jbyte CallStaticByteMethodA(jclass clazz,\r\n                                jmethodID methodID, const jvalue *args) {\r\n        return functions->CallStaticByteMethodA(this,clazz,methodID,args);\r\n    }\r\n\r\n    jchar CallStaticCharMethod(jclass clazz,\r\n                               jmethodID methodID, ...) {\r\n        va_list args;\r\n        jchar result;\r\n        va_start(args,methodID);\r\n        result = functions->CallStaticCharMethodV(this,clazz,methodID,args);\r\n        va_end(args);\r\n        return result;\r\n    }\r\n    jchar CallStaticCharMethodV(jclass clazz,\r\n                                jmethodID methodID, va_list args) {\r\n        return functions->CallStaticCharMethodV(this,clazz,methodID,args);\r\n    }\r\n    jchar CallStaticCharMethodA(jclass clazz,\r\n                                jmethodID methodID, const jvalue *args) {\r\n        return functions->CallStaticCharMethodA(this,clazz,methodID,args);\r\n    }\r\n\r\n    jshort CallStaticShortMethod(jclass clazz,\r\n                                 jmethodID methodID, ...) {\r\n        va_list args;\r\n        jshort result;\r\n        va_start(args,methodID);\r\n        result = functions->CallStaticShortMethodV(this,clazz,methodID,args);\r\n        va_end(args);\r\n        return result;\r\n    }\r\n    jshort CallStaticShortMethodV(jclass clazz,\r\n                                  jmethodID methodID, va_list args) {\r\n        return functions->CallStaticShortMethodV(this,clazz,methodID,args);\r\n    }\r\n    jshort CallStaticShortMethodA(jclass clazz,\r\n                                  jmethodID methodID, const jvalue *args) {\r\n        return functions->CallStaticShortMethodA(this,clazz,methodID,args);\r\n    }\r\n\r\n    jint CallStaticIntMethod(jclass clazz,\r\n                             jmethodID methodID, ...) {\r\n        va_list args;\r\n        jint result;\r\n        va_start(args,methodID);\r\n        result = functions->CallStaticIntMethodV(this,clazz,methodID,args);\r\n        va_end(args);\r\n        return result;\r\n    }\r\n    jint CallStaticIntMethodV(jclass clazz,\r\n                              jmethodID methodID, va_list args) {\r\n        return functions->CallStaticIntMethodV(this,clazz,methodID,args);\r\n    }\r\n    jint CallStaticIntMethodA(jclass clazz,\r\n                              jmethodID methodID, const jvalue *args) {\r\n        return functions->CallStaticIntMethodA(this,clazz,methodID,args);\r\n    }\r\n\r\n    jlong CallStaticLongMethod(jclass clazz,\r\n                               jmethodID methodID, ...) {\r\n        va_list args;\r\n        jlong result;\r\n        va_start(args,methodID);\r\n        result = functions->CallStaticLongMethodV(this,clazz,methodID,args);\r\n        va_end(args);\r\n        return result;\r\n    }\r\n    jlong CallStaticLongMethodV(jclass clazz,\r\n                                jmethodID methodID, va_list args) {\r\n        return functions->CallStaticLongMethodV(this,clazz,methodID,args);\r\n    }\r\n    jlong CallStaticLongMethodA(jclass clazz,\r\n                                jmethodID methodID, const jvalue *args) {\r\n        return functions->CallStaticLongMethodA(this,clazz,methodID,args);\r\n    }\r\n\r\n    jfloat CallStaticFloatMethod(jclass clazz,\r\n                                 jmethodID methodID, ...) {\r\n        va_list args;\r\n        jfloat result;\r\n        va_start(args,methodID);\r\n        result = functions->CallStaticFloatMethodV(this,clazz,methodID,args);\r\n        va_end(args);\r\n        return result;\r\n    }\r\n    jfloat CallStaticFloatMethodV(jclass clazz,\r\n                                  jmethodID methodID, va_list args) {\r\n        return functions->CallStaticFloatMethodV(this,clazz,methodID,args);\r\n    }\r\n    jfloat CallStaticFloatMethodA(jclass clazz,\r\n                                  jmethodID methodID, const jvalue *args) {\r\n        return functions->CallStaticFloatMethodA(this,clazz,methodID,args);\r\n    }\r\n\r\n    jdouble CallStaticDoubleMethod(jclass clazz,\r\n                                   jmethodID methodID, ...) {\r\n        va_list args;\r\n        jdouble result;\r\n        va_start(args,methodID);\r\n        result = functions->CallStaticDoubleMethodV(this,clazz,methodID,args);\r\n        va_end(args);\r\n        return result;\r\n    }\r\n    jdouble CallStaticDoubleMethodV(jclass clazz,\r\n                                    jmethodID methodID, va_list args) {\r\n        return functions->CallStaticDoubleMethodV(this,clazz,methodID,args);\r\n    }\r\n    jdouble CallStaticDoubleMethodA(jclass clazz,\r\n                                    jmethodID methodID, const jvalue *args) {\r\n        return functions->CallStaticDoubleMethodA(this,clazz,methodID,args);\r\n    }\r\n\r\n    void CallStaticVoidMethod(jclass cls, jmethodID methodID, ...) {\r\n        va_list args;\r\n        va_start(args,methodID);\r\n        functions->CallStaticVoidMethodV(this,cls,methodID,args);\r\n        va_end(args);\r\n    }\r\n    void CallStaticVoidMethodV(jclass cls, jmethodID methodID,\r\n                               va_list args) {\r\n        functions->CallStaticVoidMethodV(this,cls,methodID,args);\r\n    }\r\n    void CallStaticVoidMethodA(jclass cls, jmethodID methodID,\r\n                               const jvalue * args) {\r\n        functions->CallStaticVoidMethodA(this,cls,methodID,args);\r\n    }\r\n\r\n    jfieldID GetStaticFieldID(jclass clazz, const char *name,\r\n                              const char *sig) {\r\n        return functions->GetStaticFieldID(this,clazz,name,sig);\r\n    }\r\n    jobject GetStaticObjectField(jclass clazz, jfieldID fieldID) {\r\n        return functions->GetStaticObjectField(this,clazz,fieldID);\r\n    }\r\n    jboolean GetStaticBooleanField(jclass clazz, jfieldID fieldID) {\r\n        return functions->GetStaticBooleanField(this,clazz,fieldID);\r\n    }\r\n    jbyte GetStaticByteField(jclass clazz, jfieldID fieldID) {\r\n        return functions->GetStaticByteField(this,clazz,fieldID);\r\n    }\r\n    jchar GetStaticCharField(jclass clazz, jfieldID fieldID) {\r\n        return functions->GetStaticCharField(this,clazz,fieldID);\r\n    }\r\n    jshort GetStaticShortField(jclass clazz, jfieldID fieldID) {\r\n        return functions->GetStaticShortField(this,clazz,fieldID);\r\n    }\r\n    jint GetStaticIntField(jclass clazz, jfieldID fieldID) {\r\n        return functions->GetStaticIntField(this,clazz,fieldID);\r\n    }\r\n    jlong GetStaticLongField(jclass clazz, jfieldID fieldID) {\r\n        return functions->GetStaticLongField(this,clazz,fieldID);\r\n    }\r\n    jfloat GetStaticFloatField(jclass clazz, jfieldID fieldID) {\r\n        return functions->GetStaticFloatField(this,clazz,fieldID);\r\n    }\r\n    jdouble GetStaticDoubleField(jclass clazz, jfieldID fieldID) {\r\n        return functions->GetStaticDoubleField(this,clazz,fieldID);\r\n    }\r\n\r\n    void SetStaticObjectField(jclass clazz, jfieldID fieldID,\r\n                        jobject value) {\r\n      functions->SetStaticObjectField(this,clazz,fieldID,value);\r\n    }\r\n    void SetStaticBooleanField(jclass clazz, jfieldID fieldID,\r\n                        jboolean value) {\r\n      functions->SetStaticBooleanField(this,clazz,fieldID,value);\r\n    }\r\n    void SetStaticByteField(jclass clazz, jfieldID fieldID,\r\n                        jbyte value) {\r\n      functions->SetStaticByteField(this,clazz,fieldID,value);\r\n    }\r\n    void SetStaticCharField(jclass clazz, jfieldID fieldID,\r\n                        jchar value) {\r\n      functions->SetStaticCharField(this,clazz,fieldID,value);\r\n    }\r\n    void SetStaticShortField(jclass clazz, jfieldID fieldID,\r\n                        jshort value) {\r\n      functions->SetStaticShortField(this,clazz,fieldID,value);\r\n    }\r\n    void SetStaticIntField(jclass clazz, jfieldID fieldID,\r\n                        jint value) {\r\n      functions->SetStaticIntField(this,clazz,fieldID,value);\r\n    }\r\n    void SetStaticLongField(jclass clazz, jfieldID fieldID,\r\n                        jlong value) {\r\n      functions->SetStaticLongField(this,clazz,fieldID,value);\r\n    }\r\n    void SetStaticFloatField(jclass clazz, jfieldID fieldID,\r\n                        jfloat value) {\r\n      functions->SetStaticFloatField(this,clazz,fieldID,value);\r\n    }\r\n    void SetStaticDoubleField(jclass clazz, jfieldID fieldID,\r\n                        jdouble value) {\r\n      functions->SetStaticDoubleField(this,clazz,fieldID,value);\r\n    }\r\n\r\n    jstring NewString(const jchar *unicode, jsize len) {\r\n        return functions->NewString(this,unicode,len);\r\n    }\r\n    jsize GetStringLength(jstring str) {\r\n        return functions->GetStringLength(this,str);\r\n    }\r\n    const jchar *GetStringChars(jstring str, jboolean *isCopy) {\r\n        return functions->GetStringChars(this,str,isCopy);\r\n    }\r\n    void ReleaseStringChars(jstring str, const jchar *chars) {\r\n        functions->ReleaseStringChars(this,str,chars);\r\n    }\r\n\r\n    jstring NewStringUTF(const char *utf) {\r\n        return functions->NewStringUTF(this,utf);\r\n    }\r\n    jsize GetStringUTFLength(jstring str) {\r\n        return functions->GetStringUTFLength(this,str);\r\n    }\r\n    const char* GetStringUTFChars(jstring str, jboolean *isCopy) {\r\n        return functions->GetStringUTFChars(this,str,isCopy);\r\n    }\r\n    void ReleaseStringUTFChars(jstring str, const char* chars) {\r\n        functions->ReleaseStringUTFChars(this,str,chars);\r\n    }\r\n\r\n    jsize GetArrayLength(jarray array) {\r\n        return functions->GetArrayLength(this,array);\r\n    }\r\n\r\n    jobjectArray NewObjectArray(jsize len, jclass clazz,\r\n                                jobject init) {\r\n        return functions->NewObjectArray(this,len,clazz,init);\r\n    }\r\n    jobject GetObjectArrayElement(jobjectArray array, jsize index) {\r\n        return functions->GetObjectArrayElement(this,array,index);\r\n    }\r\n    void SetObjectArrayElement(jobjectArray array, jsize index,\r\n                               jobject val) {\r\n        functions->SetObjectArrayElement(this,array,index,val);\r\n    }\r\n\r\n    jbooleanArray NewBooleanArray(jsize len) {\r\n        return functions->NewBooleanArray(this,len);\r\n    }\r\n    jbyteArray NewByteArray(jsize len) {\r\n        return functions->NewByteArray(this,len);\r\n    }\r\n    jcharArray NewCharArray(jsize len) {\r\n        return functions->NewCharArray(this,len);\r\n    }\r\n    jshortArray NewShortArray(jsize len) {\r\n        return functions->NewShortArray(this,len);\r\n    }\r\n    jintArray NewIntArray(jsize len) {\r\n        return functions->NewIntArray(this,len);\r\n    }\r\n    jlongArray NewLongArray(jsize len) {\r\n        return functions->NewLongArray(this,len);\r\n    }\r\n    jfloatArray NewFloatArray(jsize len) {\r\n        return functions->NewFloatArray(this,len);\r\n    }\r\n    jdoubleArray NewDoubleArray(jsize len) {\r\n        return functions->NewDoubleArray(this,len);\r\n    }\r\n\r\n    jboolean * GetBooleanArrayElements(jbooleanArray array, jboolean *isCopy) {\r\n        return functions->GetBooleanArrayElements(this,array,isCopy);\r\n    }\r\n    jbyte * GetByteArrayElements(jbyteArray array, jboolean *isCopy) {\r\n        return functions->GetByteArrayElements(this,array,isCopy);\r\n    }\r\n    jchar * GetCharArrayElements(jcharArray array, jboolean *isCopy) {\r\n        return functions->GetCharArrayElements(this,array,isCopy);\r\n    }\r\n    jshort * GetShortArrayElements(jshortArray array, jboolean *isCopy) {\r\n        return functions->GetShortArrayElements(this,array,isCopy);\r\n    }\r\n    jint * GetIntArrayElements(jintArray array, jboolean *isCopy) {\r\n        return functions->GetIntArrayElements(this,array,isCopy);\r\n    }\r\n    jlong * GetLongArrayElements(jlongArray array, jboolean *isCopy) {\r\n        return functions->GetLongArrayElements(this,array,isCopy);\r\n    }\r\n    jfloat * GetFloatArrayElements(jfloatArray array, jboolean *isCopy) {\r\n        return functions->GetFloatArrayElements(this,array,isCopy);\r\n    }\r\n    jdouble * GetDoubleArrayElements(jdoubleArray array, jboolean *isCopy) {\r\n        return functions->GetDoubleArrayElements(this,array,isCopy);\r\n    }\r\n\r\n    void ReleaseBooleanArrayElements(jbooleanArray array,\r\n                                     jboolean *elems,\r\n                                     jint mode) {\r\n        functions->ReleaseBooleanArrayElements(this,array,elems,mode);\r\n    }\r\n    void ReleaseByteArrayElements(jbyteArray array,\r\n                                  jbyte *elems,\r\n                                  jint mode) {\r\n        functions->ReleaseByteArrayElements(this,array,elems,mode);\r\n    }\r\n    void ReleaseCharArrayElements(jcharArray array,\r\n                                  jchar *elems,\r\n                                  jint mode) {\r\n        functions->ReleaseCharArrayElements(this,array,elems,mode);\r\n    }\r\n    void ReleaseShortArrayElements(jshortArray array,\r\n                                   jshort *elems,\r\n                                   jint mode) {\r\n        functions->ReleaseShortArrayElements(this,array,elems,mode);\r\n    }\r\n    void ReleaseIntArrayElements(jintArray array,\r\n                                 jint *elems,\r\n                                 jint mode) {\r\n        functions->ReleaseIntArrayElements(this,array,elems,mode);\r\n    }\r\n    void ReleaseLongArrayElements(jlongArray array,\r\n                                  jlong *elems,\r\n                                  jint mode) {\r\n        functions->ReleaseLongArrayElements(this,array,elems,mode);\r\n    }\r\n    void ReleaseFloatArrayElements(jfloatArray array,\r\n                                   jfloat *elems,\r\n                                   jint mode) {\r\n        functions->ReleaseFloatArrayElements(this,array,elems,mode);\r\n    }\r\n    void ReleaseDoubleArrayElements(jdoubleArray array,\r\n                                    jdouble *elems,\r\n                                    jint mode) {\r\n        functions->ReleaseDoubleArrayElements(this,array,elems,mode);\r\n    }\r\n\r\n    void GetBooleanArrayRegion(jbooleanArray array,\r\n                               jsize start, jsize len, jboolean *buf) {\r\n        functions->GetBooleanArrayRegion(this,array,start,len,buf);\r\n    }\r\n    void GetByteArrayRegion(jbyteArray array,\r\n                            jsize start, jsize len, jbyte *buf) {\r\n        functions->GetByteArrayRegion(this,array,start,len,buf);\r\n    }\r\n    void GetCharArrayRegion(jcharArray array,\r\n                            jsize start, jsize len, jchar *buf) {\r\n        functions->GetCharArrayRegion(this,array,start,len,buf);\r\n    }\r\n    void GetShortArrayRegion(jshortArray array,\r\n                             jsize start, jsize len, jshort *buf) {\r\n        functions->GetShortArrayRegion(this,array,start,len,buf);\r\n    }\r\n    void GetIntArrayRegion(jintArray array,\r\n                           jsize start, jsize len, jint *buf) {\r\n        functions->GetIntArrayRegion(this,array,start,len,buf);\r\n    }\r\n    void GetLongArrayRegion(jlongArray array,\r\n                            jsize start, jsize len, jlong *buf) {\r\n        functions->GetLongArrayRegion(this,array,start,len,buf);\r\n    }\r\n    void GetFloatArrayRegion(jfloatArray array,\r\n                             jsize start, jsize len, jfloat *buf) {\r\n        functions->GetFloatArrayRegion(this,array,start,len,buf);\r\n    }\r\n    void GetDoubleArrayRegion(jdoubleArray array,\r\n                              jsize start, jsize len, jdouble *buf) {\r\n        functions->GetDoubleArrayRegion(this,array,start,len,buf);\r\n    }\r\n\r\n    void SetBooleanArrayRegion(jbooleanArray array, jsize start, jsize len,\r\n                               const jboolean *buf) {\r\n        functions->SetBooleanArrayRegion(this,array,start,len,buf);\r\n    }\r\n    void SetByteArrayRegion(jbyteArray array, jsize start, jsize len,\r\n                            const jbyte *buf) {\r\n        functions->SetByteArrayRegion(this,array,start,len,buf);\r\n    }\r\n    void SetCharArrayRegion(jcharArray array, jsize start, jsize len,\r\n                            const jchar *buf) {\r\n        functions->SetCharArrayRegion(this,array,start,len,buf);\r\n    }\r\n    void SetShortArrayRegion(jshortArray array, jsize start, jsize len,\r\n                             const jshort *buf) {\r\n        functions->SetShortArrayRegion(this,array,start,len,buf);\r\n    }\r\n    void SetIntArrayRegion(jintArray array, jsize start, jsize len,\r\n                           const jint *buf) {\r\n        functions->SetIntArrayRegion(this,array,start,len,buf);\r\n    }\r\n    void SetLongArrayRegion(jlongArray array, jsize start, jsize len,\r\n                            const jlong *buf) {\r\n        functions->SetLongArrayRegion(this,array,start,len,buf);\r\n    }\r\n    void SetFloatArrayRegion(jfloatArray array, jsize start, jsize len,\r\n                             const jfloat *buf) {\r\n        functions->SetFloatArrayRegion(this,array,start,len,buf);\r\n    }\r\n    void SetDoubleArrayRegion(jdoubleArray array, jsize start, jsize len,\r\n                              const jdouble *buf) {\r\n        functions->SetDoubleArrayRegion(this,array,start,len,buf);\r\n    }\r\n\r\n    jint RegisterNatives(jclass clazz, const JNINativeMethod *methods,\r\n                         jint nMethods) {\r\n        return functions->RegisterNatives(this,clazz,methods,nMethods);\r\n    }\r\n    jint UnregisterNatives(jclass clazz) {\r\n        return functions->UnregisterNatives(this,clazz);\r\n    }\r\n\r\n    jint MonitorEnter(jobject obj) {\r\n        return functions->MonitorEnter(this,obj);\r\n    }\r\n    jint MonitorExit(jobject obj) {\r\n        return functions->MonitorExit(this,obj);\r\n    }\r\n\r\n    jint GetJavaVM(JavaVM **vm) {\r\n        return functions->GetJavaVM(this,vm);\r\n    }\r\n\r\n    void GetStringRegion(jstring str, jsize start, jsize len, jchar *buf) {\r\n        functions->GetStringRegion(this,str,start,len,buf);\r\n    }\r\n    void GetStringUTFRegion(jstring str, jsize start, jsize len, char *buf) {\r\n        functions->GetStringUTFRegion(this,str,start,len,buf);\r\n    }\r\n\r\n    void * GetPrimitiveArrayCritical(jarray array, jboolean *isCopy) {\r\n        return functions->GetPrimitiveArrayCritical(this,array,isCopy);\r\n    }\r\n    void ReleasePrimitiveArrayCritical(jarray array, void *carray, jint mode) {\r\n        functions->ReleasePrimitiveArrayCritical(this,array,carray,mode);\r\n    }\r\n\r\n    const jchar * GetStringCritical(jstring string, jboolean *isCopy) {\r\n        return functions->GetStringCritical(this,string,isCopy);\r\n    }\r\n    void ReleaseStringCritical(jstring string, const jchar *cstring) {\r\n        functions->ReleaseStringCritical(this,string,cstring);\r\n    }\r\n\r\n    jweak NewWeakGlobalRef(jobject obj) {\r\n        return functions->NewWeakGlobalRef(this,obj);\r\n    }\r\n    void DeleteWeakGlobalRef(jweak ref) {\r\n        functions->DeleteWeakGlobalRef(this,ref);\r\n    }\r\n\r\n    jboolean ExceptionCheck() {\r\n        return functions->ExceptionCheck(this);\r\n    }\r\n\r\n    jobject NewDirectByteBuffer(void* address, jlong capacity) {\r\n        return functions->NewDirectByteBuffer(this, address, capacity);\r\n    }\r\n    void* GetDirectBufferAddress(jobject buf) {\r\n        return functions->GetDirectBufferAddress(this, buf);\r\n    }\r\n    jlong GetDirectBufferCapacity(jobject buf) {\r\n        return functions->GetDirectBufferCapacity(this, buf);\r\n    }\r\n    jobjectRefType GetObjectRefType(jobject obj) {\r\n        return functions->GetObjectRefType(this, obj);\r\n    }\r\n\r\n#endif /* __cplusplus */\r\n};\r\n\r\ntypedef struct JavaVMOption {\r\n    char *optionString;\r\n    void *extraInfo;\r\n} JavaVMOption;\r\n\r\ntypedef struct JavaVMInitArgs {\r\n    jint version;\r\n\r\n    jint nOptions;\r\n    JavaVMOption *options;\r\n    jboolean ignoreUnrecognized;\r\n} JavaVMInitArgs;\r\n\r\ntypedef struct JavaVMAttachArgs {\r\n    jint version;\r\n\r\n    char *name;\r\n    jobject group;\r\n} JavaVMAttachArgs;\r\n\r\n/* These will be VM-specific. */\r\n\r\n#define JDK1_2\r\n#define JDK1_4\r\n\r\n/* End VM-specific. */\r\n\r\nstruct JNIInvokeInterface_ {\r\n    void *reserved0;\r\n    void *reserved1;\r\n    void *reserved2;\r\n\r\n    jint (JNICALL *DestroyJavaVM)(JavaVM *vm);\r\n\r\n    jint (JNICALL *AttachCurrentThread)(JavaVM *vm, void **penv, void *args);\r\n\r\n    jint (JNICALL *DetachCurrentThread)(JavaVM *vm);\r\n\r\n    jint (JNICALL *GetEnv)(JavaVM *vm, void **penv, jint version);\r\n\r\n    jint (JNICALL *AttachCurrentThreadAsDaemon)(JavaVM *vm, void **penv, void *args);\r\n};\r\n\r\nstruct JavaVM_ {\r\n    const struct JNIInvokeInterface_ *functions;\r\n#ifdef __cplusplus\r\n\r\n    jint DestroyJavaVM() {\r\n        return functions->DestroyJavaVM(this);\r\n    }\r\n    jint AttachCurrentThread(void **penv, void *args) {\r\n        return functions->AttachCurrentThread(this, penv, args);\r\n    }\r\n    jint DetachCurrentThread() {\r\n        return functions->DetachCurrentThread(this);\r\n    }\r\n\r\n    jint GetEnv(void **penv, jint version) {\r\n        return functions->GetEnv(this, penv, version);\r\n    }\r\n    jint AttachCurrentThreadAsDaemon(void **penv, void *args) {\r\n        return functions->AttachCurrentThreadAsDaemon(this, penv, args);\r\n    }\r\n#endif\r\n};\r\n\r\n#ifdef _JNI_IMPLEMENTATION_\r\n#define _JNI_IMPORT_OR_EXPORT_ JNIEXPORT\r\n#else\r\n#define _JNI_IMPORT_OR_EXPORT_ JNIIMPORT\r\n#endif\r\n_JNI_IMPORT_OR_EXPORT_ jint JNICALL\r\nJNI_GetDefaultJavaVMInitArgs(void *args);\r\n\r\n_JNI_IMPORT_OR_EXPORT_ jint JNICALL\r\nJNI_CreateJavaVM(JavaVM **pvm, void **penv, void *args);\r\n\r\n_JNI_IMPORT_OR_EXPORT_ jint JNICALL\r\nJNI_GetCreatedJavaVMs(JavaVM **, jsize, jsize *);\r\n\r\n/* Defined by native libraries. */\r\nJNIEXPORT jint JNICALL\r\nJNI_OnLoad(JavaVM *vm, void *reserved);\r\n\r\nJNIEXPORT void JNICALL\r\nJNI_OnUnload(JavaVM *vm, void *reserved);\r\n\r\n#define JNI_VERSION_1_1 0x00010001\r\n#define JNI_VERSION_1_2 0x00010002\r\n#define JNI_VERSION_1_4 0x00010004\r\n#define JNI_VERSION_1_6 0x00010006\r\n#define JNI_VERSION_1_8 0x00010008\r\n\r\n#ifdef __cplusplus\r\n} /* extern \"C\" */\r\n#endif /* __cplusplus */\r\n\r\n#endif /* !_JAVASOFT_JNI_H_ */\r\n"
  },
  {
    "path": "native-src/jvm/jni_md.h",
    "content": "/*\r\n * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.\r\n * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.\r\n *\r\n *\r\n *\r\n *\r\n *\r\n *\r\n *\r\n *\r\n *\r\n *\r\n *\r\n *\r\n *\r\n *\r\n *\r\n *\r\n *\r\n *\r\n *\r\n *\r\n */\r\n\r\n#ifndef _JAVASOFT_JNI_MD_H_\r\n#define _JAVASOFT_JNI_MD_H_\r\n\r\n#ifndef __has_attribute\r\n  #define __has_attribute(x) 0\r\n#endif\r\n#if (defined(__GNUC__) && ((__GNUC__ > 4) || (__GNUC__ == 4) && (__GNUC_MINOR__ > 2))) || __has_attribute(visibility)\r\n  #define JNIEXPORT     __attribute__((visibility(\"default\")))\r\n  #define JNIIMPORT     __attribute__((visibility(\"default\")))\r\n#else\r\n  #define JNIEXPORT\r\n  #define JNIIMPORT\r\n#endif\r\n\r\n#define JNICALL\r\n\r\ntypedef int jint;\r\n#ifdef _LP64 /* 64-bit Solaris */\r\ntypedef long jlong;\r\n#else\r\ntypedef long long jlong;\r\n#endif\r\n\r\ntypedef signed char jbyte;\r\n\r\n#endif /* !_JAVASOFT_JNI_MD_H_ */\r\n"
  },
  {
    "path": "native-src/jvm/jvmti.h",
    "content": "/*\r\n * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.\r\n * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.\r\n *\r\n *\r\n *\r\n *\r\n *\r\n *\r\n *\r\n *\r\n *\r\n *\r\n *\r\n *\r\n *\r\n *\r\n *\r\n *\r\n *\r\n *\r\n *\r\n *\r\n */\r\n\r\n    /* AUTOMATICALLY GENERATED FILE - DO NOT EDIT */\r\n\r\n\r\n    /* Include file for the Java(tm) Virtual Machine Tool Interface */\r\n\r\n#ifndef _JAVA_JVMTI_H_\r\n#define _JAVA_JVMTI_H_\r\n\r\n#include \"jni.h\"\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\nenum {\r\n    JVMTI_VERSION_1   = 0x30010000,\r\n    JVMTI_VERSION_1_0 = 0x30010000,\r\n    JVMTI_VERSION_1_1 = 0x30010100,\r\n    JVMTI_VERSION_1_2 = 0x30010200,\r\n\r\n    JVMTI_VERSION = 0x30000000 + (1 * 0x10000) + (2 * 0x100) + 1  /* version: 1.2.1 */\r\n};\r\n\r\nJNIEXPORT jint JNICALL\r\nAgent_OnLoad(JavaVM *vm, char *options, void *reserved);\r\n\r\nJNIEXPORT jint JNICALL\r\nAgent_OnAttach(JavaVM* vm, char* options, void* reserved);\r\n\r\nJNIEXPORT void JNICALL\r\nAgent_OnUnload(JavaVM *vm);\r\n\r\n    /* Forward declaration of the environment */\r\n\r\nstruct _jvmtiEnv;\r\n\r\nstruct jvmtiInterface_1_;\r\n\r\n#ifdef __cplusplus\r\ntypedef _jvmtiEnv jvmtiEnv;\r\n#else\r\ntypedef const struct jvmtiInterface_1_ *jvmtiEnv;\r\n#endif /* __cplusplus */\r\n\r\n/* Derived Base Types */\r\n\r\ntypedef jobject jthread;\r\ntypedef jobject jthreadGroup;\r\ntypedef jlong jlocation;\r\nstruct _jrawMonitorID;\r\ntypedef struct _jrawMonitorID *jrawMonitorID;\r\ntypedef struct JNINativeInterface_ jniNativeInterface;\r\n\r\n    /* Constants */\r\n\r\n\r\n    /* Thread State Flags */\r\n\r\nenum {\r\n    JVMTI_THREAD_STATE_ALIVE = 0x0001,\r\n    JVMTI_THREAD_STATE_TERMINATED = 0x0002,\r\n    JVMTI_THREAD_STATE_RUNNABLE = 0x0004,\r\n    JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER = 0x0400,\r\n    JVMTI_THREAD_STATE_WAITING = 0x0080,\r\n    JVMTI_THREAD_STATE_WAITING_INDEFINITELY = 0x0010,\r\n    JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT = 0x0020,\r\n    JVMTI_THREAD_STATE_SLEEPING = 0x0040,\r\n    JVMTI_THREAD_STATE_IN_OBJECT_WAIT = 0x0100,\r\n    JVMTI_THREAD_STATE_PARKED = 0x0200,\r\n    JVMTI_THREAD_STATE_SUSPENDED = 0x100000,\r\n    JVMTI_THREAD_STATE_INTERRUPTED = 0x200000,\r\n    JVMTI_THREAD_STATE_IN_NATIVE = 0x400000,\r\n    JVMTI_THREAD_STATE_VENDOR_1 = 0x10000000,\r\n    JVMTI_THREAD_STATE_VENDOR_2 = 0x20000000,\r\n    JVMTI_THREAD_STATE_VENDOR_3 = 0x40000000\r\n};\r\n\r\n    /* java.lang.Thread.State Conversion Masks */\r\n\r\nenum {\r\n    JVMTI_JAVA_LANG_THREAD_STATE_MASK = JVMTI_THREAD_STATE_TERMINATED | JVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_RUNNABLE | JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER | JVMTI_THREAD_STATE_WAITING | JVMTI_THREAD_STATE_WAITING_INDEFINITELY | JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT,\r\n    JVMTI_JAVA_LANG_THREAD_STATE_NEW = 0,\r\n    JVMTI_JAVA_LANG_THREAD_STATE_TERMINATED = JVMTI_THREAD_STATE_TERMINATED,\r\n    JVMTI_JAVA_LANG_THREAD_STATE_RUNNABLE = JVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_RUNNABLE,\r\n    JVMTI_JAVA_LANG_THREAD_STATE_BLOCKED = JVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER,\r\n    JVMTI_JAVA_LANG_THREAD_STATE_WAITING = JVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_WAITING | JVMTI_THREAD_STATE_WAITING_INDEFINITELY,\r\n    JVMTI_JAVA_LANG_THREAD_STATE_TIMED_WAITING = JVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_WAITING | JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT\r\n};\r\n\r\n    /* Thread Priority Constants */\r\n\r\nenum {\r\n    JVMTI_THREAD_MIN_PRIORITY = 1,\r\n    JVMTI_THREAD_NORM_PRIORITY = 5,\r\n    JVMTI_THREAD_MAX_PRIORITY = 10\r\n};\r\n\r\n    /* Heap Filter Flags */\r\n\r\nenum {\r\n    JVMTI_HEAP_FILTER_TAGGED = 0x4,\r\n    JVMTI_HEAP_FILTER_UNTAGGED = 0x8,\r\n    JVMTI_HEAP_FILTER_CLASS_TAGGED = 0x10,\r\n    JVMTI_HEAP_FILTER_CLASS_UNTAGGED = 0x20\r\n};\r\n\r\n    /* Heap Visit Control Flags */\r\n\r\nenum {\r\n    JVMTI_VISIT_OBJECTS = 0x100,\r\n    JVMTI_VISIT_ABORT = 0x8000\r\n};\r\n\r\n    /* Heap Reference Enumeration */\r\n\r\ntypedef enum {\r\n    JVMTI_HEAP_REFERENCE_CLASS = 1,\r\n    JVMTI_HEAP_REFERENCE_FIELD = 2,\r\n    JVMTI_HEAP_REFERENCE_ARRAY_ELEMENT = 3,\r\n    JVMTI_HEAP_REFERENCE_CLASS_LOADER = 4,\r\n    JVMTI_HEAP_REFERENCE_SIGNERS = 5,\r\n    JVMTI_HEAP_REFERENCE_PROTECTION_DOMAIN = 6,\r\n    JVMTI_HEAP_REFERENCE_INTERFACE = 7,\r\n    JVMTI_HEAP_REFERENCE_STATIC_FIELD = 8,\r\n    JVMTI_HEAP_REFERENCE_CONSTANT_POOL = 9,\r\n    JVMTI_HEAP_REFERENCE_SUPERCLASS = 10,\r\n    JVMTI_HEAP_REFERENCE_JNI_GLOBAL = 21,\r\n    JVMTI_HEAP_REFERENCE_SYSTEM_CLASS = 22,\r\n    JVMTI_HEAP_REFERENCE_MONITOR = 23,\r\n    JVMTI_HEAP_REFERENCE_STACK_LOCAL = 24,\r\n    JVMTI_HEAP_REFERENCE_JNI_LOCAL = 25,\r\n    JVMTI_HEAP_REFERENCE_THREAD = 26,\r\n    JVMTI_HEAP_REFERENCE_OTHER = 27\r\n} jvmtiHeapReferenceKind;\r\n\r\n    /* Primitive Type Enumeration */\r\n\r\ntypedef enum {\r\n    JVMTI_PRIMITIVE_TYPE_BOOLEAN = 90,\r\n    JVMTI_PRIMITIVE_TYPE_BYTE = 66,\r\n    JVMTI_PRIMITIVE_TYPE_CHAR = 67,\r\n    JVMTI_PRIMITIVE_TYPE_SHORT = 83,\r\n    JVMTI_PRIMITIVE_TYPE_INT = 73,\r\n    JVMTI_PRIMITIVE_TYPE_LONG = 74,\r\n    JVMTI_PRIMITIVE_TYPE_FLOAT = 70,\r\n    JVMTI_PRIMITIVE_TYPE_DOUBLE = 68\r\n} jvmtiPrimitiveType;\r\n\r\n    /* Heap Object Filter Enumeration */\r\n\r\ntypedef enum {\r\n    JVMTI_HEAP_OBJECT_TAGGED = 1,\r\n    JVMTI_HEAP_OBJECT_UNTAGGED = 2,\r\n    JVMTI_HEAP_OBJECT_EITHER = 3\r\n} jvmtiHeapObjectFilter;\r\n\r\n    /* Heap Root Kind Enumeration */\r\n\r\ntypedef enum {\r\n    JVMTI_HEAP_ROOT_JNI_GLOBAL = 1,\r\n    JVMTI_HEAP_ROOT_SYSTEM_CLASS = 2,\r\n    JVMTI_HEAP_ROOT_MONITOR = 3,\r\n    JVMTI_HEAP_ROOT_STACK_LOCAL = 4,\r\n    JVMTI_HEAP_ROOT_JNI_LOCAL = 5,\r\n    JVMTI_HEAP_ROOT_THREAD = 6,\r\n    JVMTI_HEAP_ROOT_OTHER = 7\r\n} jvmtiHeapRootKind;\r\n\r\n    /* Object Reference Enumeration */\r\n\r\ntypedef enum {\r\n    JVMTI_REFERENCE_CLASS = 1,\r\n    JVMTI_REFERENCE_FIELD = 2,\r\n    JVMTI_REFERENCE_ARRAY_ELEMENT = 3,\r\n    JVMTI_REFERENCE_CLASS_LOADER = 4,\r\n    JVMTI_REFERENCE_SIGNERS = 5,\r\n    JVMTI_REFERENCE_PROTECTION_DOMAIN = 6,\r\n    JVMTI_REFERENCE_INTERFACE = 7,\r\n    JVMTI_REFERENCE_STATIC_FIELD = 8,\r\n    JVMTI_REFERENCE_CONSTANT_POOL = 9\r\n} jvmtiObjectReferenceKind;\r\n\r\n    /* Iteration Control Enumeration */\r\n\r\ntypedef enum {\r\n    JVMTI_ITERATION_CONTINUE = 1,\r\n    JVMTI_ITERATION_IGNORE = 2,\r\n    JVMTI_ITERATION_ABORT = 0\r\n} jvmtiIterationControl;\r\n\r\n    /* Class Status Flags */\r\n\r\nenum {\r\n    JVMTI_CLASS_STATUS_VERIFIED = 1,\r\n    JVMTI_CLASS_STATUS_PREPARED = 2,\r\n    JVMTI_CLASS_STATUS_INITIALIZED = 4,\r\n    JVMTI_CLASS_STATUS_ERROR = 8,\r\n    JVMTI_CLASS_STATUS_ARRAY = 16,\r\n    JVMTI_CLASS_STATUS_PRIMITIVE = 32\r\n};\r\n\r\n    /* Event Enable/Disable */\r\n\r\ntypedef enum {\r\n    JVMTI_ENABLE = 1,\r\n    JVMTI_DISABLE = 0\r\n} jvmtiEventMode;\r\n\r\n    /* Extension Function/Event Parameter Types */\r\n\r\ntypedef enum {\r\n    JVMTI_TYPE_JBYTE = 101,\r\n    JVMTI_TYPE_JCHAR = 102,\r\n    JVMTI_TYPE_JSHORT = 103,\r\n    JVMTI_TYPE_JINT = 104,\r\n    JVMTI_TYPE_JLONG = 105,\r\n    JVMTI_TYPE_JFLOAT = 106,\r\n    JVMTI_TYPE_JDOUBLE = 107,\r\n    JVMTI_TYPE_JBOOLEAN = 108,\r\n    JVMTI_TYPE_JOBJECT = 109,\r\n    JVMTI_TYPE_JTHREAD = 110,\r\n    JVMTI_TYPE_JCLASS = 111,\r\n    JVMTI_TYPE_JVALUE = 112,\r\n    JVMTI_TYPE_JFIELDID = 113,\r\n    JVMTI_TYPE_JMETHODID = 114,\r\n    JVMTI_TYPE_CCHAR = 115,\r\n    JVMTI_TYPE_CVOID = 116,\r\n    JVMTI_TYPE_JNIENV = 117\r\n} jvmtiParamTypes;\r\n\r\n    /* Extension Function/Event Parameter Kinds */\r\n\r\ntypedef enum {\r\n    JVMTI_KIND_IN = 91,\r\n    JVMTI_KIND_IN_PTR = 92,\r\n    JVMTI_KIND_IN_BUF = 93,\r\n    JVMTI_KIND_ALLOC_BUF = 94,\r\n    JVMTI_KIND_ALLOC_ALLOC_BUF = 95,\r\n    JVMTI_KIND_OUT = 96,\r\n    JVMTI_KIND_OUT_BUF = 97\r\n} jvmtiParamKind;\r\n\r\n    /* Timer Kinds */\r\n\r\ntypedef enum {\r\n    JVMTI_TIMER_USER_CPU = 30,\r\n    JVMTI_TIMER_TOTAL_CPU = 31,\r\n    JVMTI_TIMER_ELAPSED = 32\r\n} jvmtiTimerKind;\r\n\r\n    /* Phases of execution */\r\n\r\ntypedef enum {\r\n    JVMTI_PHASE_ONLOAD = 1,\r\n    JVMTI_PHASE_PRIMORDIAL = 2,\r\n    JVMTI_PHASE_START = 6,\r\n    JVMTI_PHASE_LIVE = 4,\r\n    JVMTI_PHASE_DEAD = 8\r\n} jvmtiPhase;\r\n\r\n    /* Version Interface Types */\r\n\r\nenum {\r\n    JVMTI_VERSION_INTERFACE_JNI = 0x00000000,\r\n    JVMTI_VERSION_INTERFACE_JVMTI = 0x30000000\r\n};\r\n\r\n    /* Version Masks */\r\n\r\nenum {\r\n    JVMTI_VERSION_MASK_INTERFACE_TYPE = 0x70000000,\r\n    JVMTI_VERSION_MASK_MAJOR = 0x0FFF0000,\r\n    JVMTI_VERSION_MASK_MINOR = 0x0000FF00,\r\n    JVMTI_VERSION_MASK_MICRO = 0x000000FF\r\n};\r\n\r\n    /* Version Shifts */\r\n\r\nenum {\r\n    JVMTI_VERSION_SHIFT_MAJOR = 16,\r\n    JVMTI_VERSION_SHIFT_MINOR = 8,\r\n    JVMTI_VERSION_SHIFT_MICRO = 0\r\n};\r\n\r\n    /* Verbose Flag Enumeration */\r\n\r\ntypedef enum {\r\n    JVMTI_VERBOSE_OTHER = 0,\r\n    JVMTI_VERBOSE_GC = 1,\r\n    JVMTI_VERBOSE_CLASS = 2,\r\n    JVMTI_VERBOSE_JNI = 4\r\n} jvmtiVerboseFlag;\r\n\r\n    /* JLocation Format Enumeration */\r\n\r\ntypedef enum {\r\n    JVMTI_JLOCATION_JVMBCI = 1,\r\n    JVMTI_JLOCATION_MACHINEPC = 2,\r\n    JVMTI_JLOCATION_OTHER = 0\r\n} jvmtiJlocationFormat;\r\n\r\n    /* Resource Exhaustion Flags */\r\n\r\nenum {\r\n    JVMTI_RESOURCE_EXHAUSTED_OOM_ERROR = 0x0001,\r\n    JVMTI_RESOURCE_EXHAUSTED_JAVA_HEAP = 0x0002,\r\n    JVMTI_RESOURCE_EXHAUSTED_THREADS = 0x0004\r\n};\r\n\r\n    /* Errors */\r\n\r\ntypedef enum {\r\n    JVMTI_ERROR_NONE = 0,\r\n    JVMTI_ERROR_INVALID_THREAD = 10,\r\n    JVMTI_ERROR_INVALID_THREAD_GROUP = 11,\r\n    JVMTI_ERROR_INVALID_PRIORITY = 12,\r\n    JVMTI_ERROR_THREAD_NOT_SUSPENDED = 13,\r\n    JVMTI_ERROR_THREAD_SUSPENDED = 14,\r\n    JVMTI_ERROR_THREAD_NOT_ALIVE = 15,\r\n    JVMTI_ERROR_INVALID_OBJECT = 20,\r\n    JVMTI_ERROR_INVALID_CLASS = 21,\r\n    JVMTI_ERROR_CLASS_NOT_PREPARED = 22,\r\n    JVMTI_ERROR_INVALID_METHODID = 23,\r\n    JVMTI_ERROR_INVALID_LOCATION = 24,\r\n    JVMTI_ERROR_INVALID_FIELDID = 25,\r\n    JVMTI_ERROR_NO_MORE_FRAMES = 31,\r\n    JVMTI_ERROR_OPAQUE_FRAME = 32,\r\n    JVMTI_ERROR_TYPE_MISMATCH = 34,\r\n    JVMTI_ERROR_INVALID_SLOT = 35,\r\n    JVMTI_ERROR_DUPLICATE = 40,\r\n    JVMTI_ERROR_NOT_FOUND = 41,\r\n    JVMTI_ERROR_INVALID_MONITOR = 50,\r\n    JVMTI_ERROR_NOT_MONITOR_OWNER = 51,\r\n    JVMTI_ERROR_INTERRUPT = 52,\r\n    JVMTI_ERROR_INVALID_CLASS_FORMAT = 60,\r\n    JVMTI_ERROR_CIRCULAR_CLASS_DEFINITION = 61,\r\n    JVMTI_ERROR_FAILS_VERIFICATION = 62,\r\n    JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_ADDED = 63,\r\n    JVMTI_ERROR_UNSUPPORTED_REDEFINITION_SCHEMA_CHANGED = 64,\r\n    JVMTI_ERROR_INVALID_TYPESTATE = 65,\r\n    JVMTI_ERROR_UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED = 66,\r\n    JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_DELETED = 67,\r\n    JVMTI_ERROR_UNSUPPORTED_VERSION = 68,\r\n    JVMTI_ERROR_NAMES_DONT_MATCH = 69,\r\n    JVMTI_ERROR_UNSUPPORTED_REDEFINITION_CLASS_MODIFIERS_CHANGED = 70,\r\n    JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_MODIFIERS_CHANGED = 71,\r\n    JVMTI_ERROR_UNMODIFIABLE_CLASS = 79,\r\n    JVMTI_ERROR_NOT_AVAILABLE = 98,\r\n    JVMTI_ERROR_MUST_POSSESS_CAPABILITY = 99,\r\n    JVMTI_ERROR_NULL_POINTER = 100,\r\n    JVMTI_ERROR_ABSENT_INFORMATION = 101,\r\n    JVMTI_ERROR_INVALID_EVENT_TYPE = 102,\r\n    JVMTI_ERROR_ILLEGAL_ARGUMENT = 103,\r\n    JVMTI_ERROR_NATIVE_METHOD = 104,\r\n    JVMTI_ERROR_CLASS_LOADER_UNSUPPORTED = 106,\r\n    JVMTI_ERROR_OUT_OF_MEMORY = 110,\r\n    JVMTI_ERROR_ACCESS_DENIED = 111,\r\n    JVMTI_ERROR_WRONG_PHASE = 112,\r\n    JVMTI_ERROR_INTERNAL = 113,\r\n    JVMTI_ERROR_UNATTACHED_THREAD = 115,\r\n    JVMTI_ERROR_INVALID_ENVIRONMENT = 116,\r\n    JVMTI_ERROR_MAX = 116\r\n} jvmtiError;\r\n\r\n    /* Event IDs */\r\n\r\ntypedef enum {\r\n    JVMTI_MIN_EVENT_TYPE_VAL = 50,\r\n    JVMTI_EVENT_VM_INIT = 50,\r\n    JVMTI_EVENT_VM_DEATH = 51,\r\n    JVMTI_EVENT_THREAD_START = 52,\r\n    JVMTI_EVENT_THREAD_END = 53,\r\n    JVMTI_EVENT_CLASS_FILE_LOAD_HOOK = 54,\r\n    JVMTI_EVENT_CLASS_LOAD = 55,\r\n    JVMTI_EVENT_CLASS_PREPARE = 56,\r\n    JVMTI_EVENT_VM_START = 57,\r\n    JVMTI_EVENT_EXCEPTION = 58,\r\n    JVMTI_EVENT_EXCEPTION_CATCH = 59,\r\n    JVMTI_EVENT_SINGLE_STEP = 60,\r\n    JVMTI_EVENT_FRAME_POP = 61,\r\n    JVMTI_EVENT_BREAKPOINT = 62,\r\n    JVMTI_EVENT_FIELD_ACCESS = 63,\r\n    JVMTI_EVENT_FIELD_MODIFICATION = 64,\r\n    JVMTI_EVENT_METHOD_ENTRY = 65,\r\n    JVMTI_EVENT_METHOD_EXIT = 66,\r\n    JVMTI_EVENT_NATIVE_METHOD_BIND = 67,\r\n    JVMTI_EVENT_COMPILED_METHOD_LOAD = 68,\r\n    JVMTI_EVENT_COMPILED_METHOD_UNLOAD = 69,\r\n    JVMTI_EVENT_DYNAMIC_CODE_GENERATED = 70,\r\n    JVMTI_EVENT_DATA_DUMP_REQUEST = 71,\r\n    JVMTI_EVENT_MONITOR_WAIT = 73,\r\n    JVMTI_EVENT_MONITOR_WAITED = 74,\r\n    JVMTI_EVENT_MONITOR_CONTENDED_ENTER = 75,\r\n    JVMTI_EVENT_MONITOR_CONTENDED_ENTERED = 76,\r\n    JVMTI_EVENT_RESOURCE_EXHAUSTED = 80,\r\n    JVMTI_EVENT_GARBAGE_COLLECTION_START = 81,\r\n    JVMTI_EVENT_GARBAGE_COLLECTION_FINISH = 82,\r\n    JVMTI_EVENT_OBJECT_FREE = 83,\r\n    JVMTI_EVENT_VM_OBJECT_ALLOC = 84,\r\n    JVMTI_MAX_EVENT_TYPE_VAL = 84\r\n} jvmtiEvent;\r\n\r\n\r\n    /* Pre-Declarations */\r\nstruct _jvmtiThreadInfo;\r\ntypedef struct _jvmtiThreadInfo jvmtiThreadInfo;\r\nstruct _jvmtiMonitorStackDepthInfo;\r\ntypedef struct _jvmtiMonitorStackDepthInfo jvmtiMonitorStackDepthInfo;\r\nstruct _jvmtiThreadGroupInfo;\r\ntypedef struct _jvmtiThreadGroupInfo jvmtiThreadGroupInfo;\r\nstruct _jvmtiFrameInfo;\r\ntypedef struct _jvmtiFrameInfo jvmtiFrameInfo;\r\nstruct _jvmtiStackInfo;\r\ntypedef struct _jvmtiStackInfo jvmtiStackInfo;\r\nstruct _jvmtiHeapReferenceInfoField;\r\ntypedef struct _jvmtiHeapReferenceInfoField jvmtiHeapReferenceInfoField;\r\nstruct _jvmtiHeapReferenceInfoArray;\r\ntypedef struct _jvmtiHeapReferenceInfoArray jvmtiHeapReferenceInfoArray;\r\nstruct _jvmtiHeapReferenceInfoConstantPool;\r\ntypedef struct _jvmtiHeapReferenceInfoConstantPool jvmtiHeapReferenceInfoConstantPool;\r\nstruct _jvmtiHeapReferenceInfoStackLocal;\r\ntypedef struct _jvmtiHeapReferenceInfoStackLocal jvmtiHeapReferenceInfoStackLocal;\r\nstruct _jvmtiHeapReferenceInfoJniLocal;\r\ntypedef struct _jvmtiHeapReferenceInfoJniLocal jvmtiHeapReferenceInfoJniLocal;\r\nstruct _jvmtiHeapReferenceInfoReserved;\r\ntypedef struct _jvmtiHeapReferenceInfoReserved jvmtiHeapReferenceInfoReserved;\r\nunion _jvmtiHeapReferenceInfo;\r\ntypedef union _jvmtiHeapReferenceInfo jvmtiHeapReferenceInfo;\r\nstruct _jvmtiHeapCallbacks;\r\ntypedef struct _jvmtiHeapCallbacks jvmtiHeapCallbacks;\r\nstruct _jvmtiClassDefinition;\r\ntypedef struct _jvmtiClassDefinition jvmtiClassDefinition;\r\nstruct _jvmtiMonitorUsage;\r\ntypedef struct _jvmtiMonitorUsage jvmtiMonitorUsage;\r\nstruct _jvmtiLineNumberEntry;\r\ntypedef struct _jvmtiLineNumberEntry jvmtiLineNumberEntry;\r\nstruct _jvmtiLocalVariableEntry;\r\ntypedef struct _jvmtiLocalVariableEntry jvmtiLocalVariableEntry;\r\nstruct _jvmtiParamInfo;\r\ntypedef struct _jvmtiParamInfo jvmtiParamInfo;\r\nstruct _jvmtiExtensionFunctionInfo;\r\ntypedef struct _jvmtiExtensionFunctionInfo jvmtiExtensionFunctionInfo;\r\nstruct _jvmtiExtensionEventInfo;\r\ntypedef struct _jvmtiExtensionEventInfo jvmtiExtensionEventInfo;\r\nstruct _jvmtiTimerInfo;\r\ntypedef struct _jvmtiTimerInfo jvmtiTimerInfo;\r\nstruct _jvmtiAddrLocationMap;\r\ntypedef struct _jvmtiAddrLocationMap jvmtiAddrLocationMap;\r\n\r\n    /* Function Types */\r\n\r\ntypedef void (JNICALL *jvmtiStartFunction)\r\n    (jvmtiEnv* jvmti_env, JNIEnv* jni_env, void* arg);\r\n\r\ntypedef jint (JNICALL *jvmtiHeapIterationCallback)\r\n    (jlong class_tag, jlong size, jlong* tag_ptr, jint length, void* user_data);\r\n\r\ntypedef jint (JNICALL *jvmtiHeapReferenceCallback)\r\n    (jvmtiHeapReferenceKind reference_kind, const jvmtiHeapReferenceInfo* reference_info, jlong class_tag, jlong referrer_class_tag, jlong size, jlong* tag_ptr, jlong* referrer_tag_ptr, jint length, void* user_data);\r\n\r\ntypedef jint (JNICALL *jvmtiPrimitiveFieldCallback)\r\n    (jvmtiHeapReferenceKind kind, const jvmtiHeapReferenceInfo* info, jlong object_class_tag, jlong* object_tag_ptr, jvalue value, jvmtiPrimitiveType value_type, void* user_data);\r\n\r\ntypedef jint (JNICALL *jvmtiArrayPrimitiveValueCallback)\r\n    (jlong class_tag, jlong size, jlong* tag_ptr, jint element_count, jvmtiPrimitiveType element_type, const void* elements, void* user_data);\r\n\r\ntypedef jint (JNICALL *jvmtiStringPrimitiveValueCallback)\r\n    (jlong class_tag, jlong size, jlong* tag_ptr, const jchar* value, jint value_length, void* user_data);\r\n\r\ntypedef jint (JNICALL *jvmtiReservedCallback)\r\n    ();\r\n\r\ntypedef jvmtiIterationControl (JNICALL *jvmtiHeapObjectCallback)\r\n    (jlong class_tag, jlong size, jlong* tag_ptr, void* user_data);\r\n\r\ntypedef jvmtiIterationControl (JNICALL *jvmtiHeapRootCallback)\r\n    (jvmtiHeapRootKind root_kind, jlong class_tag, jlong size, jlong* tag_ptr, void* user_data);\r\n\r\ntypedef jvmtiIterationControl (JNICALL *jvmtiStackReferenceCallback)\r\n    (jvmtiHeapRootKind root_kind, jlong class_tag, jlong size, jlong* tag_ptr, jlong thread_tag, jint depth, jmethodID method, jint slot, void* user_data);\r\n\r\ntypedef jvmtiIterationControl (JNICALL *jvmtiObjectReferenceCallback)\r\n    (jvmtiObjectReferenceKind reference_kind, jlong class_tag, jlong size, jlong* tag_ptr, jlong referrer_tag, jint referrer_index, void* user_data);\r\n\r\ntypedef jvmtiError (JNICALL *jvmtiExtensionFunction)\r\n    (jvmtiEnv* jvmti_env,  ...);\r\n\r\ntypedef void (JNICALL *jvmtiExtensionEvent)\r\n    (jvmtiEnv* jvmti_env,  ...);\r\n\r\n\r\n    /* Structure Types */\r\nstruct _jvmtiThreadInfo {\r\n    char* name;\r\n    jint priority;\r\n    jboolean is_daemon;\r\n    jthreadGroup thread_group;\r\n    jobject context_class_loader;\r\n};\r\nstruct _jvmtiMonitorStackDepthInfo {\r\n    jobject monitor;\r\n    jint stack_depth;\r\n};\r\nstruct _jvmtiThreadGroupInfo {\r\n    jthreadGroup parent;\r\n    char* name;\r\n    jint max_priority;\r\n    jboolean is_daemon;\r\n};\r\nstruct _jvmtiFrameInfo {\r\n    jmethodID method;\r\n    jlocation location;\r\n};\r\nstruct _jvmtiStackInfo {\r\n    jthread thread;\r\n    jint state;\r\n    jvmtiFrameInfo* frame_buffer;\r\n    jint frame_count;\r\n};\r\nstruct _jvmtiHeapReferenceInfoField {\r\n    jint index;\r\n};\r\nstruct _jvmtiHeapReferenceInfoArray {\r\n    jint index;\r\n};\r\nstruct _jvmtiHeapReferenceInfoConstantPool {\r\n    jint index;\r\n};\r\nstruct _jvmtiHeapReferenceInfoStackLocal {\r\n    jlong thread_tag;\r\n    jlong thread_id;\r\n    jint depth;\r\n    jmethodID method;\r\n    jlocation location;\r\n    jint slot;\r\n};\r\nstruct _jvmtiHeapReferenceInfoJniLocal {\r\n    jlong thread_tag;\r\n    jlong thread_id;\r\n    jint depth;\r\n    jmethodID method;\r\n};\r\nstruct _jvmtiHeapReferenceInfoReserved {\r\n    jlong reserved1;\r\n    jlong reserved2;\r\n    jlong reserved3;\r\n    jlong reserved4;\r\n    jlong reserved5;\r\n    jlong reserved6;\r\n    jlong reserved7;\r\n    jlong reserved8;\r\n};\r\nunion _jvmtiHeapReferenceInfo {\r\n    jvmtiHeapReferenceInfoField field;\r\n    jvmtiHeapReferenceInfoArray array;\r\n    jvmtiHeapReferenceInfoConstantPool constant_pool;\r\n    jvmtiHeapReferenceInfoStackLocal stack_local;\r\n    jvmtiHeapReferenceInfoJniLocal jni_local;\r\n    jvmtiHeapReferenceInfoReserved other;\r\n};\r\nstruct _jvmtiHeapCallbacks {\r\n    jvmtiHeapIterationCallback heap_iteration_callback;\r\n    jvmtiHeapReferenceCallback heap_reference_callback;\r\n    jvmtiPrimitiveFieldCallback primitive_field_callback;\r\n    jvmtiArrayPrimitiveValueCallback array_primitive_value_callback;\r\n    jvmtiStringPrimitiveValueCallback string_primitive_value_callback;\r\n    jvmtiReservedCallback reserved5;\r\n    jvmtiReservedCallback reserved6;\r\n    jvmtiReservedCallback reserved7;\r\n    jvmtiReservedCallback reserved8;\r\n    jvmtiReservedCallback reserved9;\r\n    jvmtiReservedCallback reserved10;\r\n    jvmtiReservedCallback reserved11;\r\n    jvmtiReservedCallback reserved12;\r\n    jvmtiReservedCallback reserved13;\r\n    jvmtiReservedCallback reserved14;\r\n    jvmtiReservedCallback reserved15;\r\n};\r\nstruct _jvmtiClassDefinition {\r\n    jclass klass;\r\n    jint class_byte_count;\r\n    const unsigned char* class_bytes;\r\n};\r\nstruct _jvmtiMonitorUsage {\r\n    jthread owner;\r\n    jint entry_count;\r\n    jint waiter_count;\r\n    jthread* waiters;\r\n    jint notify_waiter_count;\r\n    jthread* notify_waiters;\r\n};\r\nstruct _jvmtiLineNumberEntry {\r\n    jlocation start_location;\r\n    jint line_number;\r\n};\r\nstruct _jvmtiLocalVariableEntry {\r\n    jlocation start_location;\r\n    jint length;\r\n    char* name;\r\n    char* signature;\r\n    char* generic_signature;\r\n    jint slot;\r\n};\r\nstruct _jvmtiParamInfo {\r\n    char* name;\r\n    jvmtiParamKind kind;\r\n    jvmtiParamTypes base_type;\r\n    jboolean null_ok;\r\n};\r\nstruct _jvmtiExtensionFunctionInfo {\r\n    jvmtiExtensionFunction func;\r\n    char* id;\r\n    char* short_description;\r\n    jint param_count;\r\n    jvmtiParamInfo* params;\r\n    jint error_count;\r\n    jvmtiError* errors;\r\n};\r\nstruct _jvmtiExtensionEventInfo {\r\n    jint extension_event_index;\r\n    char* id;\r\n    char* short_description;\r\n    jint param_count;\r\n    jvmtiParamInfo* params;\r\n};\r\nstruct _jvmtiTimerInfo {\r\n    jlong max_value;\r\n    jboolean may_skip_forward;\r\n    jboolean may_skip_backward;\r\n    jvmtiTimerKind kind;\r\n    jlong reserved1;\r\n    jlong reserved2;\r\n};\r\nstruct _jvmtiAddrLocationMap {\r\n    const void* start_address;\r\n    jlocation location;\r\n};\r\n\r\ntypedef struct {\r\n    unsigned int can_tag_objects : 1;\r\n    unsigned int can_generate_field_modification_events : 1;\r\n    unsigned int can_generate_field_access_events : 1;\r\n    unsigned int can_get_bytecodes : 1;\r\n    unsigned int can_get_synthetic_attribute : 1;\r\n    unsigned int can_get_owned_monitor_info : 1;\r\n    unsigned int can_get_current_contended_monitor : 1;\r\n    unsigned int can_get_monitor_info : 1;\r\n    unsigned int can_pop_frame : 1;\r\n    unsigned int can_redefine_classes : 1;\r\n    unsigned int can_signal_thread : 1;\r\n    unsigned int can_get_source_file_name : 1;\r\n    unsigned int can_get_line_numbers : 1;\r\n    unsigned int can_get_source_debug_extension : 1;\r\n    unsigned int can_access_local_variables : 1;\r\n    unsigned int can_maintain_original_method_order : 1;\r\n    unsigned int can_generate_single_step_events : 1;\r\n    unsigned int can_generate_exception_events : 1;\r\n    unsigned int can_generate_frame_pop_events : 1;\r\n    unsigned int can_generate_breakpoint_events : 1;\r\n    unsigned int can_suspend : 1;\r\n    unsigned int can_redefine_any_class : 1;\r\n    unsigned int can_get_current_thread_cpu_time : 1;\r\n    unsigned int can_get_thread_cpu_time : 1;\r\n    unsigned int can_generate_method_entry_events : 1;\r\n    unsigned int can_generate_method_exit_events : 1;\r\n    unsigned int can_generate_all_class_hook_events : 1;\r\n    unsigned int can_generate_compiled_method_load_events : 1;\r\n    unsigned int can_generate_monitor_events : 1;\r\n    unsigned int can_generate_vm_object_alloc_events : 1;\r\n    unsigned int can_generate_native_method_bind_events : 1;\r\n    unsigned int can_generate_garbage_collection_events : 1;\r\n    unsigned int can_generate_object_free_events : 1;\r\n    unsigned int can_force_early_return : 1;\r\n    unsigned int can_get_owned_monitor_stack_depth_info : 1;\r\n    unsigned int can_get_constant_pool : 1;\r\n    unsigned int can_set_native_method_prefix : 1;\r\n    unsigned int can_retransform_classes : 1;\r\n    unsigned int can_retransform_any_class : 1;\r\n    unsigned int can_generate_resource_exhaustion_heap_events : 1;\r\n    unsigned int can_generate_resource_exhaustion_threads_events : 1;\r\n    unsigned int : 7;\r\n    unsigned int : 16;\r\n    unsigned int : 16;\r\n    unsigned int : 16;\r\n    unsigned int : 16;\r\n    unsigned int : 16;\r\n} jvmtiCapabilities;\r\n\r\n\r\n    /* Event Definitions */\r\n\r\ntypedef void (JNICALL *jvmtiEventReserved)(void);\r\n\r\n\r\ntypedef void (JNICALL *jvmtiEventBreakpoint)\r\n    (jvmtiEnv *jvmti_env,\r\n     JNIEnv* jni_env,\r\n     jthread thread,\r\n     jmethodID method,\r\n     jlocation location);\r\n\r\ntypedef void (JNICALL *jvmtiEventClassFileLoadHook)\r\n    (jvmtiEnv *jvmti_env,\r\n     JNIEnv* jni_env,\r\n     jclass class_being_redefined,\r\n     jobject loader,\r\n     const char* name,\r\n     jobject protection_domain,\r\n     jint class_data_len,\r\n     const unsigned char* class_data,\r\n     jint* new_class_data_len,\r\n     unsigned char** new_class_data);\r\n\r\ntypedef void (JNICALL *jvmtiEventClassLoad)\r\n    (jvmtiEnv *jvmti_env,\r\n     JNIEnv* jni_env,\r\n     jthread thread,\r\n     jclass klass);\r\n\r\ntypedef void (JNICALL *jvmtiEventClassPrepare)\r\n    (jvmtiEnv *jvmti_env,\r\n     JNIEnv* jni_env,\r\n     jthread thread,\r\n     jclass klass);\r\n\r\ntypedef void (JNICALL *jvmtiEventCompiledMethodLoad)\r\n    (jvmtiEnv *jvmti_env,\r\n     jmethodID method,\r\n     jint code_size,\r\n     const void* code_addr,\r\n     jint map_length,\r\n     const jvmtiAddrLocationMap* map,\r\n     const void* compile_info);\r\n\r\ntypedef void (JNICALL *jvmtiEventCompiledMethodUnload)\r\n    (jvmtiEnv *jvmti_env,\r\n     jmethodID method,\r\n     const void* code_addr);\r\n\r\ntypedef void (JNICALL *jvmtiEventDataDumpRequest)\r\n    (jvmtiEnv *jvmti_env);\r\n\r\ntypedef void (JNICALL *jvmtiEventDynamicCodeGenerated)\r\n    (jvmtiEnv *jvmti_env,\r\n     const char* name,\r\n     const void* address,\r\n     jint length);\r\n\r\ntypedef void (JNICALL *jvmtiEventException)\r\n    (jvmtiEnv *jvmti_env,\r\n     JNIEnv* jni_env,\r\n     jthread thread,\r\n     jmethodID method,\r\n     jlocation location,\r\n     jobject exception,\r\n     jmethodID catch_method,\r\n     jlocation catch_location);\r\n\r\ntypedef void (JNICALL *jvmtiEventExceptionCatch)\r\n    (jvmtiEnv *jvmti_env,\r\n     JNIEnv* jni_env,\r\n     jthread thread,\r\n     jmethodID method,\r\n     jlocation location,\r\n     jobject exception);\r\n\r\ntypedef void (JNICALL *jvmtiEventFieldAccess)\r\n    (jvmtiEnv *jvmti_env,\r\n     JNIEnv* jni_env,\r\n     jthread thread,\r\n     jmethodID method,\r\n     jlocation location,\r\n     jclass field_klass,\r\n     jobject object,\r\n     jfieldID field);\r\n\r\ntypedef void (JNICALL *jvmtiEventFieldModification)\r\n    (jvmtiEnv *jvmti_env,\r\n     JNIEnv* jni_env,\r\n     jthread thread,\r\n     jmethodID method,\r\n     jlocation location,\r\n     jclass field_klass,\r\n     jobject object,\r\n     jfieldID field,\r\n     char signature_type,\r\n     jvalue new_value);\r\n\r\ntypedef void (JNICALL *jvmtiEventFramePop)\r\n    (jvmtiEnv *jvmti_env,\r\n     JNIEnv* jni_env,\r\n     jthread thread,\r\n     jmethodID method,\r\n     jboolean was_popped_by_exception);\r\n\r\ntypedef void (JNICALL *jvmtiEventGarbageCollectionFinish)\r\n    (jvmtiEnv *jvmti_env);\r\n\r\ntypedef void (JNICALL *jvmtiEventGarbageCollectionStart)\r\n    (jvmtiEnv *jvmti_env);\r\n\r\ntypedef void (JNICALL *jvmtiEventMethodEntry)\r\n    (jvmtiEnv *jvmti_env,\r\n     JNIEnv* jni_env,\r\n     jthread thread,\r\n     jmethodID method);\r\n\r\ntypedef void (JNICALL *jvmtiEventMethodExit)\r\n    (jvmtiEnv *jvmti_env,\r\n     JNIEnv* jni_env,\r\n     jthread thread,\r\n     jmethodID method,\r\n     jboolean was_popped_by_exception,\r\n     jvalue return_value);\r\n\r\ntypedef void (JNICALL *jvmtiEventMonitorContendedEnter)\r\n    (jvmtiEnv *jvmti_env,\r\n     JNIEnv* jni_env,\r\n     jthread thread,\r\n     jobject object);\r\n\r\ntypedef void (JNICALL *jvmtiEventMonitorContendedEntered)\r\n    (jvmtiEnv *jvmti_env,\r\n     JNIEnv* jni_env,\r\n     jthread thread,\r\n     jobject object);\r\n\r\ntypedef void (JNICALL *jvmtiEventMonitorWait)\r\n    (jvmtiEnv *jvmti_env,\r\n     JNIEnv* jni_env,\r\n     jthread thread,\r\n     jobject object,\r\n     jlong timeout);\r\n\r\ntypedef void (JNICALL *jvmtiEventMonitorWaited)\r\n    (jvmtiEnv *jvmti_env,\r\n     JNIEnv* jni_env,\r\n     jthread thread,\r\n     jobject object,\r\n     jboolean timed_out);\r\n\r\ntypedef void (JNICALL *jvmtiEventNativeMethodBind)\r\n    (jvmtiEnv *jvmti_env,\r\n     JNIEnv* jni_env,\r\n     jthread thread,\r\n     jmethodID method,\r\n     void* address,\r\n     void** new_address_ptr);\r\n\r\ntypedef void (JNICALL *jvmtiEventObjectFree)\r\n    (jvmtiEnv *jvmti_env,\r\n     jlong tag);\r\n\r\ntypedef void (JNICALL *jvmtiEventResourceExhausted)\r\n    (jvmtiEnv *jvmti_env,\r\n     JNIEnv* jni_env,\r\n     jint flags,\r\n     const void* reserved,\r\n     const char* description);\r\n\r\ntypedef void (JNICALL *jvmtiEventSingleStep)\r\n    (jvmtiEnv *jvmti_env,\r\n     JNIEnv* jni_env,\r\n     jthread thread,\r\n     jmethodID method,\r\n     jlocation location);\r\n\r\ntypedef void (JNICALL *jvmtiEventThreadEnd)\r\n    (jvmtiEnv *jvmti_env,\r\n     JNIEnv* jni_env,\r\n     jthread thread);\r\n\r\ntypedef void (JNICALL *jvmtiEventThreadStart)\r\n    (jvmtiEnv *jvmti_env,\r\n     JNIEnv* jni_env,\r\n     jthread thread);\r\n\r\ntypedef void (JNICALL *jvmtiEventVMDeath)\r\n    (jvmtiEnv *jvmti_env,\r\n     JNIEnv* jni_env);\r\n\r\ntypedef void (JNICALL *jvmtiEventVMInit)\r\n    (jvmtiEnv *jvmti_env,\r\n     JNIEnv* jni_env,\r\n     jthread thread);\r\n\r\ntypedef void (JNICALL *jvmtiEventVMObjectAlloc)\r\n    (jvmtiEnv *jvmti_env,\r\n     JNIEnv* jni_env,\r\n     jthread thread,\r\n     jobject object,\r\n     jclass object_klass,\r\n     jlong size);\r\n\r\ntypedef void (JNICALL *jvmtiEventVMStart)\r\n    (jvmtiEnv *jvmti_env,\r\n     JNIEnv* jni_env);\r\n\r\n    /* Event Callback Structure */\r\n\r\ntypedef struct {\r\n                              /*   50 : VM Initialization Event */\r\n    jvmtiEventVMInit VMInit;\r\n                              /*   51 : VM Death Event */\r\n    jvmtiEventVMDeath VMDeath;\r\n                              /*   52 : Thread Start */\r\n    jvmtiEventThreadStart ThreadStart;\r\n                              /*   53 : Thread End */\r\n    jvmtiEventThreadEnd ThreadEnd;\r\n                              /*   54 : Class File Load Hook */\r\n    jvmtiEventClassFileLoadHook ClassFileLoadHook;\r\n                              /*   55 : Class Load */\r\n    jvmtiEventClassLoad ClassLoad;\r\n                              /*   56 : Class Prepare */\r\n    jvmtiEventClassPrepare ClassPrepare;\r\n                              /*   57 : VM Start Event */\r\n    jvmtiEventVMStart VMStart;\r\n                              /*   58 : Exception */\r\n    jvmtiEventException Exception;\r\n                              /*   59 : Exception Catch */\r\n    jvmtiEventExceptionCatch ExceptionCatch;\r\n                              /*   60 : Single Step */\r\n    jvmtiEventSingleStep SingleStep;\r\n                              /*   61 : Frame Pop */\r\n    jvmtiEventFramePop FramePop;\r\n                              /*   62 : Breakpoint */\r\n    jvmtiEventBreakpoint Breakpoint;\r\n                              /*   63 : Field Access */\r\n    jvmtiEventFieldAccess FieldAccess;\r\n                              /*   64 : Field Modification */\r\n    jvmtiEventFieldModification FieldModification;\r\n                              /*   65 : Method Entry */\r\n    jvmtiEventMethodEntry MethodEntry;\r\n                              /*   66 : Method Exit */\r\n    jvmtiEventMethodExit MethodExit;\r\n                              /*   67 : Native Method Bind */\r\n    jvmtiEventNativeMethodBind NativeMethodBind;\r\n                              /*   68 : Compiled Method Load */\r\n    jvmtiEventCompiledMethodLoad CompiledMethodLoad;\r\n                              /*   69 : Compiled Method Unload */\r\n    jvmtiEventCompiledMethodUnload CompiledMethodUnload;\r\n                              /*   70 : Dynamic Code Generated */\r\n    jvmtiEventDynamicCodeGenerated DynamicCodeGenerated;\r\n                              /*   71 : Data Dump Request */\r\n    jvmtiEventDataDumpRequest DataDumpRequest;\r\n                              /*   72 */\r\n    jvmtiEventReserved reserved72;\r\n                              /*   73 : Monitor Wait */\r\n    jvmtiEventMonitorWait MonitorWait;\r\n                              /*   74 : Monitor Waited */\r\n    jvmtiEventMonitorWaited MonitorWaited;\r\n                              /*   75 : Monitor Contended Enter */\r\n    jvmtiEventMonitorContendedEnter MonitorContendedEnter;\r\n                              /*   76 : Monitor Contended Entered */\r\n    jvmtiEventMonitorContendedEntered MonitorContendedEntered;\r\n                              /*   77 */\r\n    jvmtiEventReserved reserved77;\r\n                              /*   78 */\r\n    jvmtiEventReserved reserved78;\r\n                              /*   79 */\r\n    jvmtiEventReserved reserved79;\r\n                              /*   80 : Resource Exhausted */\r\n    jvmtiEventResourceExhausted ResourceExhausted;\r\n                              /*   81 : Garbage Collection Start */\r\n    jvmtiEventGarbageCollectionStart GarbageCollectionStart;\r\n                              /*   82 : Garbage Collection Finish */\r\n    jvmtiEventGarbageCollectionFinish GarbageCollectionFinish;\r\n                              /*   83 : Object Free */\r\n    jvmtiEventObjectFree ObjectFree;\r\n                              /*   84 : VM Object Allocation */\r\n    jvmtiEventVMObjectAlloc VMObjectAlloc;\r\n} jvmtiEventCallbacks;\r\n\r\n\r\n    /* Function Interface */\r\n\r\ntypedef struct jvmtiInterface_1_ {\r\n\r\n  /*   1 :  RESERVED */\r\n  void *reserved1;\r\n\r\n  /*   2 : Set Event Notification Mode */\r\n  jvmtiError (JNICALL *SetEventNotificationMode) (jvmtiEnv* env,\r\n    jvmtiEventMode mode,\r\n    jvmtiEvent event_type,\r\n    jthread event_thread,\r\n     ...);\r\n\r\n  /*   3 :  RESERVED */\r\n  void *reserved3;\r\n\r\n  /*   4 : Get All Threads */\r\n  jvmtiError (JNICALL *GetAllThreads) (jvmtiEnv* env,\r\n    jint* threads_count_ptr,\r\n    jthread** threads_ptr);\r\n\r\n  /*   5 : Suspend Thread */\r\n  jvmtiError (JNICALL *SuspendThread) (jvmtiEnv* env,\r\n    jthread thread);\r\n\r\n  /*   6 : Resume Thread */\r\n  jvmtiError (JNICALL *ResumeThread) (jvmtiEnv* env,\r\n    jthread thread);\r\n\r\n  /*   7 : Stop Thread */\r\n  jvmtiError (JNICALL *StopThread) (jvmtiEnv* env,\r\n    jthread thread,\r\n    jobject exception);\r\n\r\n  /*   8 : Interrupt Thread */\r\n  jvmtiError (JNICALL *InterruptThread) (jvmtiEnv* env,\r\n    jthread thread);\r\n\r\n  /*   9 : Get Thread Info */\r\n  jvmtiError (JNICALL *GetThreadInfo) (jvmtiEnv* env,\r\n    jthread thread,\r\n    jvmtiThreadInfo* info_ptr);\r\n\r\n  /*   10 : Get Owned Monitor Info */\r\n  jvmtiError (JNICALL *GetOwnedMonitorInfo) (jvmtiEnv* env,\r\n    jthread thread,\r\n    jint* owned_monitor_count_ptr,\r\n    jobject** owned_monitors_ptr);\r\n\r\n  /*   11 : Get Current Contended Monitor */\r\n  jvmtiError (JNICALL *GetCurrentContendedMonitor) (jvmtiEnv* env,\r\n    jthread thread,\r\n    jobject* monitor_ptr);\r\n\r\n  /*   12 : Run Agent Thread */\r\n  jvmtiError (JNICALL *RunAgentThread) (jvmtiEnv* env,\r\n    jthread thread,\r\n    jvmtiStartFunction proc,\r\n    const void* arg,\r\n    jint priority);\r\n\r\n  /*   13 : Get Top Thread Groups */\r\n  jvmtiError (JNICALL *GetTopThreadGroups) (jvmtiEnv* env,\r\n    jint* group_count_ptr,\r\n    jthreadGroup** groups_ptr);\r\n\r\n  /*   14 : Get Thread Group Info */\r\n  jvmtiError (JNICALL *GetThreadGroupInfo) (jvmtiEnv* env,\r\n    jthreadGroup group,\r\n    jvmtiThreadGroupInfo* info_ptr);\r\n\r\n  /*   15 : Get Thread Group Children */\r\n  jvmtiError (JNICALL *GetThreadGroupChildren) (jvmtiEnv* env,\r\n    jthreadGroup group,\r\n    jint* thread_count_ptr,\r\n    jthread** threads_ptr,\r\n    jint* group_count_ptr,\r\n    jthreadGroup** groups_ptr);\r\n\r\n  /*   16 : Get Frame Count */\r\n  jvmtiError (JNICALL *GetFrameCount) (jvmtiEnv* env,\r\n    jthread thread,\r\n    jint* count_ptr);\r\n\r\n  /*   17 : Get Thread State */\r\n  jvmtiError (JNICALL *GetThreadState) (jvmtiEnv* env,\r\n    jthread thread,\r\n    jint* thread_state_ptr);\r\n\r\n  /*   18 : Get Current Thread */\r\n  jvmtiError (JNICALL *GetCurrentThread) (jvmtiEnv* env,\r\n    jthread* thread_ptr);\r\n\r\n  /*   19 : Get Frame Location */\r\n  jvmtiError (JNICALL *GetFrameLocation) (jvmtiEnv* env,\r\n    jthread thread,\r\n    jint depth,\r\n    jmethodID* method_ptr,\r\n    jlocation* location_ptr);\r\n\r\n  /*   20 : Notify Frame Pop */\r\n  jvmtiError (JNICALL *NotifyFramePop) (jvmtiEnv* env,\r\n    jthread thread,\r\n    jint depth);\r\n\r\n  /*   21 : Get Local Variable - Object */\r\n  jvmtiError (JNICALL *GetLocalObject) (jvmtiEnv* env,\r\n    jthread thread,\r\n    jint depth,\r\n    jint slot,\r\n    jobject* value_ptr);\r\n\r\n  /*   22 : Get Local Variable - Int */\r\n  jvmtiError (JNICALL *GetLocalInt) (jvmtiEnv* env,\r\n    jthread thread,\r\n    jint depth,\r\n    jint slot,\r\n    jint* value_ptr);\r\n\r\n  /*   23 : Get Local Variable - Long */\r\n  jvmtiError (JNICALL *GetLocalLong) (jvmtiEnv* env,\r\n    jthread thread,\r\n    jint depth,\r\n    jint slot,\r\n    jlong* value_ptr);\r\n\r\n  /*   24 : Get Local Variable - Float */\r\n  jvmtiError (JNICALL *GetLocalFloat) (jvmtiEnv* env,\r\n    jthread thread,\r\n    jint depth,\r\n    jint slot,\r\n    jfloat* value_ptr);\r\n\r\n  /*   25 : Get Local Variable - Double */\r\n  jvmtiError (JNICALL *GetLocalDouble) (jvmtiEnv* env,\r\n    jthread thread,\r\n    jint depth,\r\n    jint slot,\r\n    jdouble* value_ptr);\r\n\r\n  /*   26 : Set Local Variable - Object */\r\n  jvmtiError (JNICALL *SetLocalObject) (jvmtiEnv* env,\r\n    jthread thread,\r\n    jint depth,\r\n    jint slot,\r\n    jobject value);\r\n\r\n  /*   27 : Set Local Variable - Int */\r\n  jvmtiError (JNICALL *SetLocalInt) (jvmtiEnv* env,\r\n    jthread thread,\r\n    jint depth,\r\n    jint slot,\r\n    jint value);\r\n\r\n  /*   28 : Set Local Variable - Long */\r\n  jvmtiError (JNICALL *SetLocalLong) (jvmtiEnv* env,\r\n    jthread thread,\r\n    jint depth,\r\n    jint slot,\r\n    jlong value);\r\n\r\n  /*   29 : Set Local Variable - Float */\r\n  jvmtiError (JNICALL *SetLocalFloat) (jvmtiEnv* env,\r\n    jthread thread,\r\n    jint depth,\r\n    jint slot,\r\n    jfloat value);\r\n\r\n  /*   30 : Set Local Variable - Double */\r\n  jvmtiError (JNICALL *SetLocalDouble) (jvmtiEnv* env,\r\n    jthread thread,\r\n    jint depth,\r\n    jint slot,\r\n    jdouble value);\r\n\r\n  /*   31 : Create Raw Monitor */\r\n  jvmtiError (JNICALL *CreateRawMonitor) (jvmtiEnv* env,\r\n    const char* name,\r\n    jrawMonitorID* monitor_ptr);\r\n\r\n  /*   32 : Destroy Raw Monitor */\r\n  jvmtiError (JNICALL *DestroyRawMonitor) (jvmtiEnv* env,\r\n    jrawMonitorID monitor);\r\n\r\n  /*   33 : Raw Monitor Enter */\r\n  jvmtiError (JNICALL *RawMonitorEnter) (jvmtiEnv* env,\r\n    jrawMonitorID monitor);\r\n\r\n  /*   34 : Raw Monitor Exit */\r\n  jvmtiError (JNICALL *RawMonitorExit) (jvmtiEnv* env,\r\n    jrawMonitorID monitor);\r\n\r\n  /*   35 : Raw Monitor Wait */\r\n  jvmtiError (JNICALL *RawMonitorWait) (jvmtiEnv* env,\r\n    jrawMonitorID monitor,\r\n    jlong millis);\r\n\r\n  /*   36 : Raw Monitor Notify */\r\n  jvmtiError (JNICALL *RawMonitorNotify) (jvmtiEnv* env,\r\n    jrawMonitorID monitor);\r\n\r\n  /*   37 : Raw Monitor Notify All */\r\n  jvmtiError (JNICALL *RawMonitorNotifyAll) (jvmtiEnv* env,\r\n    jrawMonitorID monitor);\r\n\r\n  /*   38 : Set Breakpoint */\r\n  jvmtiError (JNICALL *SetBreakpoint) (jvmtiEnv* env,\r\n    jmethodID method,\r\n    jlocation location);\r\n\r\n  /*   39 : Clear Breakpoint */\r\n  jvmtiError (JNICALL *ClearBreakpoint) (jvmtiEnv* env,\r\n    jmethodID method,\r\n    jlocation location);\r\n\r\n  /*   40 :  RESERVED */\r\n  void *reserved40;\r\n\r\n  /*   41 : Set Field Access Watch */\r\n  jvmtiError (JNICALL *SetFieldAccessWatch) (jvmtiEnv* env,\r\n    jclass klass,\r\n    jfieldID field);\r\n\r\n  /*   42 : Clear Field Access Watch */\r\n  jvmtiError (JNICALL *ClearFieldAccessWatch) (jvmtiEnv* env,\r\n    jclass klass,\r\n    jfieldID field);\r\n\r\n  /*   43 : Set Field Modification Watch */\r\n  jvmtiError (JNICALL *SetFieldModificationWatch) (jvmtiEnv* env,\r\n    jclass klass,\r\n    jfieldID field);\r\n\r\n  /*   44 : Clear Field Modification Watch */\r\n  jvmtiError (JNICALL *ClearFieldModificationWatch) (jvmtiEnv* env,\r\n    jclass klass,\r\n    jfieldID field);\r\n\r\n  /*   45 : Is Modifiable Class */\r\n  jvmtiError (JNICALL *IsModifiableClass) (jvmtiEnv* env,\r\n    jclass klass,\r\n    jboolean* is_modifiable_class_ptr);\r\n\r\n  /*   46 : Allocate */\r\n  jvmtiError (JNICALL *Allocate) (jvmtiEnv* env,\r\n    jlong size,\r\n    unsigned char** mem_ptr);\r\n\r\n  /*   47 : Deallocate */\r\n  jvmtiError (JNICALL *Deallocate) (jvmtiEnv* env,\r\n    unsigned char* mem);\r\n\r\n  /*   48 : Get Class Signature */\r\n  jvmtiError (JNICALL *GetClassSignature) (jvmtiEnv* env,\r\n    jclass klass,\r\n    char** signature_ptr,\r\n    char** generic_ptr);\r\n\r\n  /*   49 : Get Class Status */\r\n  jvmtiError (JNICALL *GetClassStatus) (jvmtiEnv* env,\r\n    jclass klass,\r\n    jint* status_ptr);\r\n\r\n  /*   50 : Get Source File Name */\r\n  jvmtiError (JNICALL *GetSourceFileName) (jvmtiEnv* env,\r\n    jclass klass,\r\n    char** source_name_ptr);\r\n\r\n  /*   51 : Get Class Modifiers */\r\n  jvmtiError (JNICALL *GetClassModifiers) (jvmtiEnv* env,\r\n    jclass klass,\r\n    jint* modifiers_ptr);\r\n\r\n  /*   52 : Get Class Methods */\r\n  jvmtiError (JNICALL *GetClassMethods) (jvmtiEnv* env,\r\n    jclass klass,\r\n    jint* method_count_ptr,\r\n    jmethodID** methods_ptr);\r\n\r\n  /*   53 : Get Class Fields */\r\n  jvmtiError (JNICALL *GetClassFields) (jvmtiEnv* env,\r\n    jclass klass,\r\n    jint* field_count_ptr,\r\n    jfieldID** fields_ptr);\r\n\r\n  /*   54 : Get Implemented Interfaces */\r\n  jvmtiError (JNICALL *GetImplementedInterfaces) (jvmtiEnv* env,\r\n    jclass klass,\r\n    jint* interface_count_ptr,\r\n    jclass** interfaces_ptr);\r\n\r\n  /*   55 : Is Interface */\r\n  jvmtiError (JNICALL *IsInterface) (jvmtiEnv* env,\r\n    jclass klass,\r\n    jboolean* is_interface_ptr);\r\n\r\n  /*   56 : Is Array Class */\r\n  jvmtiError (JNICALL *IsArrayClass) (jvmtiEnv* env,\r\n    jclass klass,\r\n    jboolean* is_array_class_ptr);\r\n\r\n  /*   57 : Get Class Loader */\r\n  jvmtiError (JNICALL *GetClassLoader) (jvmtiEnv* env,\r\n    jclass klass,\r\n    jobject* classloader_ptr);\r\n\r\n  /*   58 : Get Object Hash Code */\r\n  jvmtiError (JNICALL *GetObjectHashCode) (jvmtiEnv* env,\r\n    jobject object,\r\n    jint* hash_code_ptr);\r\n\r\n  /*   59 : Get Object Monitor Usage */\r\n  jvmtiError (JNICALL *GetObjectMonitorUsage) (jvmtiEnv* env,\r\n    jobject object,\r\n    jvmtiMonitorUsage* info_ptr);\r\n\r\n  /*   60 : Get Field Name (and Signature) */\r\n  jvmtiError (JNICALL *GetFieldName) (jvmtiEnv* env,\r\n    jclass klass,\r\n    jfieldID field,\r\n    char** name_ptr,\r\n    char** signature_ptr,\r\n    char** generic_ptr);\r\n\r\n  /*   61 : Get Field Declaring Class */\r\n  jvmtiError (JNICALL *GetFieldDeclaringClass) (jvmtiEnv* env,\r\n    jclass klass,\r\n    jfieldID field,\r\n    jclass* declaring_class_ptr);\r\n\r\n  /*   62 : Get Field Modifiers */\r\n  jvmtiError (JNICALL *GetFieldModifiers) (jvmtiEnv* env,\r\n    jclass klass,\r\n    jfieldID field,\r\n    jint* modifiers_ptr);\r\n\r\n  /*   63 : Is Field Synthetic */\r\n  jvmtiError (JNICALL *IsFieldSynthetic) (jvmtiEnv* env,\r\n    jclass klass,\r\n    jfieldID field,\r\n    jboolean* is_synthetic_ptr);\r\n\r\n  /*   64 : Get Method Name (and Signature) */\r\n  jvmtiError (JNICALL *GetMethodName) (jvmtiEnv* env,\r\n    jmethodID method,\r\n    char** name_ptr,\r\n    char** signature_ptr,\r\n    char** generic_ptr);\r\n\r\n  /*   65 : Get Method Declaring Class */\r\n  jvmtiError (JNICALL *GetMethodDeclaringClass) (jvmtiEnv* env,\r\n    jmethodID method,\r\n    jclass* declaring_class_ptr);\r\n\r\n  /*   66 : Get Method Modifiers */\r\n  jvmtiError (JNICALL *GetMethodModifiers) (jvmtiEnv* env,\r\n    jmethodID method,\r\n    jint* modifiers_ptr);\r\n\r\n  /*   67 :  RESERVED */\r\n  void *reserved67;\r\n\r\n  /*   68 : Get Max Locals */\r\n  jvmtiError (JNICALL *GetMaxLocals) (jvmtiEnv* env,\r\n    jmethodID method,\r\n    jint* max_ptr);\r\n\r\n  /*   69 : Get Arguments Size */\r\n  jvmtiError (JNICALL *GetArgumentsSize) (jvmtiEnv* env,\r\n    jmethodID method,\r\n    jint* size_ptr);\r\n\r\n  /*   70 : Get Line Number Table */\r\n  jvmtiError (JNICALL *GetLineNumberTable) (jvmtiEnv* env,\r\n    jmethodID method,\r\n    jint* entry_count_ptr,\r\n    jvmtiLineNumberEntry** table_ptr);\r\n\r\n  /*   71 : Get Method Location */\r\n  jvmtiError (JNICALL *GetMethodLocation) (jvmtiEnv* env,\r\n    jmethodID method,\r\n    jlocation* start_location_ptr,\r\n    jlocation* end_location_ptr);\r\n\r\n  /*   72 : Get Local Variable Table */\r\n  jvmtiError (JNICALL *GetLocalVariableTable) (jvmtiEnv* env,\r\n    jmethodID method,\r\n    jint* entry_count_ptr,\r\n    jvmtiLocalVariableEntry** table_ptr);\r\n\r\n  /*   73 : Set Native Method Prefix */\r\n  jvmtiError (JNICALL *SetNativeMethodPrefix) (jvmtiEnv* env,\r\n    const char* prefix);\r\n\r\n  /*   74 : Set Native Method Prefixes */\r\n  jvmtiError (JNICALL *SetNativeMethodPrefixes) (jvmtiEnv* env,\r\n    jint prefix_count,\r\n    char** prefixes);\r\n\r\n  /*   75 : Get Bytecodes */\r\n  jvmtiError (JNICALL *GetBytecodes) (jvmtiEnv* env,\r\n    jmethodID method,\r\n    jint* bytecode_count_ptr,\r\n    unsigned char** bytecodes_ptr);\r\n\r\n  /*   76 : Is Method Native */\r\n  jvmtiError (JNICALL *IsMethodNative) (jvmtiEnv* env,\r\n    jmethodID method,\r\n    jboolean* is_native_ptr);\r\n\r\n  /*   77 : Is Method Synthetic */\r\n  jvmtiError (JNICALL *IsMethodSynthetic) (jvmtiEnv* env,\r\n    jmethodID method,\r\n    jboolean* is_synthetic_ptr);\r\n\r\n  /*   78 : Get Loaded Classes */\r\n  jvmtiError (JNICALL *GetLoadedClasses) (jvmtiEnv* env,\r\n    jint* class_count_ptr,\r\n    jclass** classes_ptr);\r\n\r\n  /*   79 : Get Classloader Classes */\r\n  jvmtiError (JNICALL *GetClassLoaderClasses) (jvmtiEnv* env,\r\n    jobject initiating_loader,\r\n    jint* class_count_ptr,\r\n    jclass** classes_ptr);\r\n\r\n  /*   80 : Pop Frame */\r\n  jvmtiError (JNICALL *PopFrame) (jvmtiEnv* env,\r\n    jthread thread);\r\n\r\n  /*   81 : Force Early Return - Object */\r\n  jvmtiError (JNICALL *ForceEarlyReturnObject) (jvmtiEnv* env,\r\n    jthread thread,\r\n    jobject value);\r\n\r\n  /*   82 : Force Early Return - Int */\r\n  jvmtiError (JNICALL *ForceEarlyReturnInt) (jvmtiEnv* env,\r\n    jthread thread,\r\n    jint value);\r\n\r\n  /*   83 : Force Early Return - Long */\r\n  jvmtiError (JNICALL *ForceEarlyReturnLong) (jvmtiEnv* env,\r\n    jthread thread,\r\n    jlong value);\r\n\r\n  /*   84 : Force Early Return - Float */\r\n  jvmtiError (JNICALL *ForceEarlyReturnFloat) (jvmtiEnv* env,\r\n    jthread thread,\r\n    jfloat value);\r\n\r\n  /*   85 : Force Early Return - Double */\r\n  jvmtiError (JNICALL *ForceEarlyReturnDouble) (jvmtiEnv* env,\r\n    jthread thread,\r\n    jdouble value);\r\n\r\n  /*   86 : Force Early Return - Void */\r\n  jvmtiError (JNICALL *ForceEarlyReturnVoid) (jvmtiEnv* env,\r\n    jthread thread);\r\n\r\n  /*   87 : Redefine Classes */\r\n  jvmtiError (JNICALL *RedefineClasses) (jvmtiEnv* env,\r\n    jint class_count,\r\n    const jvmtiClassDefinition* class_definitions);\r\n\r\n  /*   88 : Get Version Number */\r\n  jvmtiError (JNICALL *GetVersionNumber) (jvmtiEnv* env,\r\n    jint* version_ptr);\r\n\r\n  /*   89 : Get Capabilities */\r\n  jvmtiError (JNICALL *GetCapabilities) (jvmtiEnv* env,\r\n    jvmtiCapabilities* capabilities_ptr);\r\n\r\n  /*   90 : Get Source Debug Extension */\r\n  jvmtiError (JNICALL *GetSourceDebugExtension) (jvmtiEnv* env,\r\n    jclass klass,\r\n    char** source_debug_extension_ptr);\r\n\r\n  /*   91 : Is Method Obsolete */\r\n  jvmtiError (JNICALL *IsMethodObsolete) (jvmtiEnv* env,\r\n    jmethodID method,\r\n    jboolean* is_obsolete_ptr);\r\n\r\n  /*   92 : Suspend Thread List */\r\n  jvmtiError (JNICALL *SuspendThreadList) (jvmtiEnv* env,\r\n    jint request_count,\r\n    const jthread* request_list,\r\n    jvmtiError* results);\r\n\r\n  /*   93 : Resume Thread List */\r\n  jvmtiError (JNICALL *ResumeThreadList) (jvmtiEnv* env,\r\n    jint request_count,\r\n    const jthread* request_list,\r\n    jvmtiError* results);\r\n\r\n  /*   94 :  RESERVED */\r\n  void *reserved94;\r\n\r\n  /*   95 :  RESERVED */\r\n  void *reserved95;\r\n\r\n  /*   96 :  RESERVED */\r\n  void *reserved96;\r\n\r\n  /*   97 :  RESERVED */\r\n  void *reserved97;\r\n\r\n  /*   98 :  RESERVED */\r\n  void *reserved98;\r\n\r\n  /*   99 :  RESERVED */\r\n  void *reserved99;\r\n\r\n  /*   100 : Get All Stack Traces */\r\n  jvmtiError (JNICALL *GetAllStackTraces) (jvmtiEnv* env,\r\n    jint max_frame_count,\r\n    jvmtiStackInfo** stack_info_ptr,\r\n    jint* thread_count_ptr);\r\n\r\n  /*   101 : Get Thread List Stack Traces */\r\n  jvmtiError (JNICALL *GetThreadListStackTraces) (jvmtiEnv* env,\r\n    jint thread_count,\r\n    const jthread* thread_list,\r\n    jint max_frame_count,\r\n    jvmtiStackInfo** stack_info_ptr);\r\n\r\n  /*   102 : Get Thread Local Storage */\r\n  jvmtiError (JNICALL *GetThreadLocalStorage) (jvmtiEnv* env,\r\n    jthread thread,\r\n    void** data_ptr);\r\n\r\n  /*   103 : Set Thread Local Storage */\r\n  jvmtiError (JNICALL *SetThreadLocalStorage) (jvmtiEnv* env,\r\n    jthread thread,\r\n    const void* data);\r\n\r\n  /*   104 : Get Stack Trace */\r\n  jvmtiError (JNICALL *GetStackTrace) (jvmtiEnv* env,\r\n    jthread thread,\r\n    jint start_depth,\r\n    jint max_frame_count,\r\n    jvmtiFrameInfo* frame_buffer,\r\n    jint* count_ptr);\r\n\r\n  /*   105 :  RESERVED */\r\n  void *reserved105;\r\n\r\n  /*   106 : Get Tag */\r\n  jvmtiError (JNICALL *GetTag) (jvmtiEnv* env,\r\n    jobject object,\r\n    jlong* tag_ptr);\r\n\r\n  /*   107 : Set Tag */\r\n  jvmtiError (JNICALL *SetTag) (jvmtiEnv* env,\r\n    jobject object,\r\n    jlong tag);\r\n\r\n  /*   108 : Force Garbage Collection */\r\n  jvmtiError (JNICALL *ForceGarbageCollection) (jvmtiEnv* env);\r\n\r\n  /*   109 : Iterate Over Objects Reachable From Object */\r\n  jvmtiError (JNICALL *IterateOverObjectsReachableFromObject) (jvmtiEnv* env,\r\n    jobject object,\r\n    jvmtiObjectReferenceCallback object_reference_callback,\r\n    const void* user_data);\r\n\r\n  /*   110 : Iterate Over Reachable Objects */\r\n  jvmtiError (JNICALL *IterateOverReachableObjects) (jvmtiEnv* env,\r\n    jvmtiHeapRootCallback heap_root_callback,\r\n    jvmtiStackReferenceCallback stack_ref_callback,\r\n    jvmtiObjectReferenceCallback object_ref_callback,\r\n    const void* user_data);\r\n\r\n  /*   111 : Iterate Over Heap */\r\n  jvmtiError (JNICALL *IterateOverHeap) (jvmtiEnv* env,\r\n    jvmtiHeapObjectFilter object_filter,\r\n    jvmtiHeapObjectCallback heap_object_callback,\r\n    const void* user_data);\r\n\r\n  /*   112 : Iterate Over Instances Of Class */\r\n  jvmtiError (JNICALL *IterateOverInstancesOfClass) (jvmtiEnv* env,\r\n    jclass klass,\r\n    jvmtiHeapObjectFilter object_filter,\r\n    jvmtiHeapObjectCallback heap_object_callback,\r\n    const void* user_data);\r\n\r\n  /*   113 :  RESERVED */\r\n  void *reserved113;\r\n\r\n  /*   114 : Get Objects With Tags */\r\n  jvmtiError (JNICALL *GetObjectsWithTags) (jvmtiEnv* env,\r\n    jint tag_count,\r\n    const jlong* tags,\r\n    jint* count_ptr,\r\n    jobject** object_result_ptr,\r\n    jlong** tag_result_ptr);\r\n\r\n  /*   115 : Follow References */\r\n  jvmtiError (JNICALL *FollowReferences) (jvmtiEnv* env,\r\n    jint heap_filter,\r\n    jclass klass,\r\n    jobject initial_object,\r\n    const jvmtiHeapCallbacks* callbacks,\r\n    const void* user_data);\r\n\r\n  /*   116 : Iterate Through Heap */\r\n  jvmtiError (JNICALL *IterateThroughHeap) (jvmtiEnv* env,\r\n    jint heap_filter,\r\n    jclass klass,\r\n    const jvmtiHeapCallbacks* callbacks,\r\n    const void* user_data);\r\n\r\n  /*   117 :  RESERVED */\r\n  void *reserved117;\r\n\r\n  /*   118 :  RESERVED */\r\n  void *reserved118;\r\n\r\n  /*   119 :  RESERVED */\r\n  void *reserved119;\r\n\r\n  /*   120 : Set JNI Function Table */\r\n  jvmtiError (JNICALL *SetJNIFunctionTable) (jvmtiEnv* env,\r\n    const jniNativeInterface* function_table);\r\n\r\n  /*   121 : Get JNI Function Table */\r\n  jvmtiError (JNICALL *GetJNIFunctionTable) (jvmtiEnv* env,\r\n    jniNativeInterface** function_table);\r\n\r\n  /*   122 : Set Event Callbacks */\r\n  jvmtiError (JNICALL *SetEventCallbacks) (jvmtiEnv* env,\r\n    const jvmtiEventCallbacks* callbacks,\r\n    jint size_of_callbacks);\r\n\r\n  /*   123 : Generate Events */\r\n  jvmtiError (JNICALL *GenerateEvents) (jvmtiEnv* env,\r\n    jvmtiEvent event_type);\r\n\r\n  /*   124 : Get Extension Functions */\r\n  jvmtiError (JNICALL *GetExtensionFunctions) (jvmtiEnv* env,\r\n    jint* extension_count_ptr,\r\n    jvmtiExtensionFunctionInfo** extensions);\r\n\r\n  /*   125 : Get Extension Events */\r\n  jvmtiError (JNICALL *GetExtensionEvents) (jvmtiEnv* env,\r\n    jint* extension_count_ptr,\r\n    jvmtiExtensionEventInfo** extensions);\r\n\r\n  /*   126 : Set Extension Event Callback */\r\n  jvmtiError (JNICALL *SetExtensionEventCallback) (jvmtiEnv* env,\r\n    jint extension_event_index,\r\n    jvmtiExtensionEvent callback);\r\n\r\n  /*   127 : Dispose Environment */\r\n  jvmtiError (JNICALL *DisposeEnvironment) (jvmtiEnv* env);\r\n\r\n  /*   128 : Get Error Name */\r\n  jvmtiError (JNICALL *GetErrorName) (jvmtiEnv* env,\r\n    jvmtiError error,\r\n    char** name_ptr);\r\n\r\n  /*   129 : Get JLocation Format */\r\n  jvmtiError (JNICALL *GetJLocationFormat) (jvmtiEnv* env,\r\n    jvmtiJlocationFormat* format_ptr);\r\n\r\n  /*   130 : Get System Properties */\r\n  jvmtiError (JNICALL *GetSystemProperties) (jvmtiEnv* env,\r\n    jint* count_ptr,\r\n    char*** property_ptr);\r\n\r\n  /*   131 : Get System Property */\r\n  jvmtiError (JNICALL *GetSystemProperty) (jvmtiEnv* env,\r\n    const char* property,\r\n    char** value_ptr);\r\n\r\n  /*   132 : Set System Property */\r\n  jvmtiError (JNICALL *SetSystemProperty) (jvmtiEnv* env,\r\n    const char* property,\r\n    const char* value);\r\n\r\n  /*   133 : Get Phase */\r\n  jvmtiError (JNICALL *GetPhase) (jvmtiEnv* env,\r\n    jvmtiPhase* phase_ptr);\r\n\r\n  /*   134 : Get Current Thread CPU Timer Information */\r\n  jvmtiError (JNICALL *GetCurrentThreadCpuTimerInfo) (jvmtiEnv* env,\r\n    jvmtiTimerInfo* info_ptr);\r\n\r\n  /*   135 : Get Current Thread CPU Time */\r\n  jvmtiError (JNICALL *GetCurrentThreadCpuTime) (jvmtiEnv* env,\r\n    jlong* nanos_ptr);\r\n\r\n  /*   136 : Get Thread CPU Timer Information */\r\n  jvmtiError (JNICALL *GetThreadCpuTimerInfo) (jvmtiEnv* env,\r\n    jvmtiTimerInfo* info_ptr);\r\n\r\n  /*   137 : Get Thread CPU Time */\r\n  jvmtiError (JNICALL *GetThreadCpuTime) (jvmtiEnv* env,\r\n    jthread thread,\r\n    jlong* nanos_ptr);\r\n\r\n  /*   138 : Get Timer Information */\r\n  jvmtiError (JNICALL *GetTimerInfo) (jvmtiEnv* env,\r\n    jvmtiTimerInfo* info_ptr);\r\n\r\n  /*   139 : Get Time */\r\n  jvmtiError (JNICALL *GetTime) (jvmtiEnv* env,\r\n    jlong* nanos_ptr);\r\n\r\n  /*   140 : Get Potential Capabilities */\r\n  jvmtiError (JNICALL *GetPotentialCapabilities) (jvmtiEnv* env,\r\n    jvmtiCapabilities* capabilities_ptr);\r\n\r\n  /*   141 :  RESERVED */\r\n  void *reserved141;\r\n\r\n  /*   142 : Add Capabilities */\r\n  jvmtiError (JNICALL *AddCapabilities) (jvmtiEnv* env,\r\n    const jvmtiCapabilities* capabilities_ptr);\r\n\r\n  /*   143 : Relinquish Capabilities */\r\n  jvmtiError (JNICALL *RelinquishCapabilities) (jvmtiEnv* env,\r\n    const jvmtiCapabilities* capabilities_ptr);\r\n\r\n  /*   144 : Get Available Processors */\r\n  jvmtiError (JNICALL *GetAvailableProcessors) (jvmtiEnv* env,\r\n    jint* processor_count_ptr);\r\n\r\n  /*   145 : Get Class Version Numbers */\r\n  jvmtiError (JNICALL *GetClassVersionNumbers) (jvmtiEnv* env,\r\n    jclass klass,\r\n    jint* minor_version_ptr,\r\n    jint* major_version_ptr);\r\n\r\n  /*   146 : Get Constant Pool */\r\n  jvmtiError (JNICALL *GetConstantPool) (jvmtiEnv* env,\r\n    jclass klass,\r\n    jint* constant_pool_count_ptr,\r\n    jint* constant_pool_byte_count_ptr,\r\n    unsigned char** constant_pool_bytes_ptr);\r\n\r\n  /*   147 : Get Environment Local Storage */\r\n  jvmtiError (JNICALL *GetEnvironmentLocalStorage) (jvmtiEnv* env,\r\n    void** data_ptr);\r\n\r\n  /*   148 : Set Environment Local Storage */\r\n  jvmtiError (JNICALL *SetEnvironmentLocalStorage) (jvmtiEnv* env,\r\n    const void* data);\r\n\r\n  /*   149 : Add To Bootstrap Class Loader Search */\r\n  jvmtiError (JNICALL *AddToBootstrapClassLoaderSearch) (jvmtiEnv* env,\r\n    const char* segment);\r\n\r\n  /*   150 : Set Verbose Flag */\r\n  jvmtiError (JNICALL *SetVerboseFlag) (jvmtiEnv* env,\r\n    jvmtiVerboseFlag flag,\r\n    jboolean value);\r\n\r\n  /*   151 : Add To System Class Loader Search */\r\n  jvmtiError (JNICALL *AddToSystemClassLoaderSearch) (jvmtiEnv* env,\r\n    const char* segment);\r\n\r\n  /*   152 : Retransform Classes */\r\n  jvmtiError (JNICALL *RetransformClasses) (jvmtiEnv* env,\r\n    jint class_count,\r\n    const jclass* classes);\r\n\r\n  /*   153 : Get Owned Monitor Stack Depth Info */\r\n  jvmtiError (JNICALL *GetOwnedMonitorStackDepthInfo) (jvmtiEnv* env,\r\n    jthread thread,\r\n    jint* monitor_info_count_ptr,\r\n    jvmtiMonitorStackDepthInfo** monitor_info_ptr);\r\n\r\n  /*   154 : Get Object Size */\r\n  jvmtiError (JNICALL *GetObjectSize) (jvmtiEnv* env,\r\n    jobject object,\r\n    jlong* size_ptr);\r\n\r\n  /*   155 : Get Local Instance */\r\n  jvmtiError (JNICALL *GetLocalInstance) (jvmtiEnv* env,\r\n    jthread thread,\r\n    jint depth,\r\n    jobject* value_ptr);\r\n\r\n} jvmtiInterface_1;\r\n\r\nstruct _jvmtiEnv {\r\n    const struct jvmtiInterface_1_ *functions;\r\n#ifdef __cplusplus\r\n\r\n\r\n  jvmtiError Allocate(jlong size,\r\n            unsigned char** mem_ptr) {\r\n    return functions->Allocate(this, size, mem_ptr);\r\n  }\r\n\r\n  jvmtiError Deallocate(unsigned char* mem) {\r\n    return functions->Deallocate(this, mem);\r\n  }\r\n\r\n  jvmtiError GetThreadState(jthread thread,\r\n            jint* thread_state_ptr) {\r\n    return functions->GetThreadState(this, thread, thread_state_ptr);\r\n  }\r\n\r\n  jvmtiError GetCurrentThread(jthread* thread_ptr) {\r\n    return functions->GetCurrentThread(this, thread_ptr);\r\n  }\r\n\r\n  jvmtiError GetAllThreads(jint* threads_count_ptr,\r\n            jthread** threads_ptr) {\r\n    return functions->GetAllThreads(this, threads_count_ptr, threads_ptr);\r\n  }\r\n\r\n  jvmtiError SuspendThread(jthread thread) {\r\n    return functions->SuspendThread(this, thread);\r\n  }\r\n\r\n  jvmtiError SuspendThreadList(jint request_count,\r\n            const jthread* request_list,\r\n            jvmtiError* results) {\r\n    return functions->SuspendThreadList(this, request_count, request_list, results);\r\n  }\r\n\r\n  jvmtiError ResumeThread(jthread thread) {\r\n    return functions->ResumeThread(this, thread);\r\n  }\r\n\r\n  jvmtiError ResumeThreadList(jint request_count,\r\n            const jthread* request_list,\r\n            jvmtiError* results) {\r\n    return functions->ResumeThreadList(this, request_count, request_list, results);\r\n  }\r\n\r\n  jvmtiError StopThread(jthread thread,\r\n            jobject exception) {\r\n    return functions->StopThread(this, thread, exception);\r\n  }\r\n\r\n  jvmtiError InterruptThread(jthread thread) {\r\n    return functions->InterruptThread(this, thread);\r\n  }\r\n\r\n  jvmtiError GetThreadInfo(jthread thread,\r\n            jvmtiThreadInfo* info_ptr) {\r\n    return functions->GetThreadInfo(this, thread, info_ptr);\r\n  }\r\n\r\n  jvmtiError GetOwnedMonitorInfo(jthread thread,\r\n            jint* owned_monitor_count_ptr,\r\n            jobject** owned_monitors_ptr) {\r\n    return functions->GetOwnedMonitorInfo(this, thread, owned_monitor_count_ptr, owned_monitors_ptr);\r\n  }\r\n\r\n  jvmtiError GetOwnedMonitorStackDepthInfo(jthread thread,\r\n            jint* monitor_info_count_ptr,\r\n            jvmtiMonitorStackDepthInfo** monitor_info_ptr) {\r\n    return functions->GetOwnedMonitorStackDepthInfo(this, thread, monitor_info_count_ptr, monitor_info_ptr);\r\n  }\r\n\r\n  jvmtiError GetCurrentContendedMonitor(jthread thread,\r\n            jobject* monitor_ptr) {\r\n    return functions->GetCurrentContendedMonitor(this, thread, monitor_ptr);\r\n  }\r\n\r\n  jvmtiError RunAgentThread(jthread thread,\r\n            jvmtiStartFunction proc,\r\n            const void* arg,\r\n            jint priority) {\r\n    return functions->RunAgentThread(this, thread, proc, arg, priority);\r\n  }\r\n\r\n  jvmtiError SetThreadLocalStorage(jthread thread,\r\n            const void* data) {\r\n    return functions->SetThreadLocalStorage(this, thread, data);\r\n  }\r\n\r\n  jvmtiError GetThreadLocalStorage(jthread thread,\r\n            void** data_ptr) {\r\n    return functions->GetThreadLocalStorage(this, thread, data_ptr);\r\n  }\r\n\r\n  jvmtiError GetTopThreadGroups(jint* group_count_ptr,\r\n            jthreadGroup** groups_ptr) {\r\n    return functions->GetTopThreadGroups(this, group_count_ptr, groups_ptr);\r\n  }\r\n\r\n  jvmtiError GetThreadGroupInfo(jthreadGroup group,\r\n            jvmtiThreadGroupInfo* info_ptr) {\r\n    return functions->GetThreadGroupInfo(this, group, info_ptr);\r\n  }\r\n\r\n  jvmtiError GetThreadGroupChildren(jthreadGroup group,\r\n            jint* thread_count_ptr,\r\n            jthread** threads_ptr,\r\n            jint* group_count_ptr,\r\n            jthreadGroup** groups_ptr) {\r\n    return functions->GetThreadGroupChildren(this, group, thread_count_ptr, threads_ptr, group_count_ptr, groups_ptr);\r\n  }\r\n\r\n  jvmtiError GetStackTrace(jthread thread,\r\n            jint start_depth,\r\n            jint max_frame_count,\r\n            jvmtiFrameInfo* frame_buffer,\r\n            jint* count_ptr) {\r\n    return functions->GetStackTrace(this, thread, start_depth, max_frame_count, frame_buffer, count_ptr);\r\n  }\r\n\r\n  jvmtiError GetAllStackTraces(jint max_frame_count,\r\n            jvmtiStackInfo** stack_info_ptr,\r\n            jint* thread_count_ptr) {\r\n    return functions->GetAllStackTraces(this, max_frame_count, stack_info_ptr, thread_count_ptr);\r\n  }\r\n\r\n  jvmtiError GetThreadListStackTraces(jint thread_count,\r\n            const jthread* thread_list,\r\n            jint max_frame_count,\r\n            jvmtiStackInfo** stack_info_ptr) {\r\n    return functions->GetThreadListStackTraces(this, thread_count, thread_list, max_frame_count, stack_info_ptr);\r\n  }\r\n\r\n  jvmtiError GetFrameCount(jthread thread,\r\n            jint* count_ptr) {\r\n    return functions->GetFrameCount(this, thread, count_ptr);\r\n  }\r\n\r\n  jvmtiError PopFrame(jthread thread) {\r\n    return functions->PopFrame(this, thread);\r\n  }\r\n\r\n  jvmtiError GetFrameLocation(jthread thread,\r\n            jint depth,\r\n            jmethodID* method_ptr,\r\n            jlocation* location_ptr) {\r\n    return functions->GetFrameLocation(this, thread, depth, method_ptr, location_ptr);\r\n  }\r\n\r\n  jvmtiError NotifyFramePop(jthread thread,\r\n            jint depth) {\r\n    return functions->NotifyFramePop(this, thread, depth);\r\n  }\r\n\r\n  jvmtiError ForceEarlyReturnObject(jthread thread,\r\n            jobject value) {\r\n    return functions->ForceEarlyReturnObject(this, thread, value);\r\n  }\r\n\r\n  jvmtiError ForceEarlyReturnInt(jthread thread,\r\n            jint value) {\r\n    return functions->ForceEarlyReturnInt(this, thread, value);\r\n  }\r\n\r\n  jvmtiError ForceEarlyReturnLong(jthread thread,\r\n            jlong value) {\r\n    return functions->ForceEarlyReturnLong(this, thread, value);\r\n  }\r\n\r\n  jvmtiError ForceEarlyReturnFloat(jthread thread,\r\n            jfloat value) {\r\n    return functions->ForceEarlyReturnFloat(this, thread, value);\r\n  }\r\n\r\n  jvmtiError ForceEarlyReturnDouble(jthread thread,\r\n            jdouble value) {\r\n    return functions->ForceEarlyReturnDouble(this, thread, value);\r\n  }\r\n\r\n  jvmtiError ForceEarlyReturnVoid(jthread thread) {\r\n    return functions->ForceEarlyReturnVoid(this, thread);\r\n  }\r\n\r\n  jvmtiError FollowReferences(jint heap_filter,\r\n            jclass klass,\r\n            jobject initial_object,\r\n            const jvmtiHeapCallbacks* callbacks,\r\n            const void* user_data) {\r\n    return functions->FollowReferences(this, heap_filter, klass, initial_object, callbacks, user_data);\r\n  }\r\n\r\n  jvmtiError IterateThroughHeap(jint heap_filter,\r\n            jclass klass,\r\n            const jvmtiHeapCallbacks* callbacks,\r\n            const void* user_data) {\r\n    return functions->IterateThroughHeap(this, heap_filter, klass, callbacks, user_data);\r\n  }\r\n\r\n  jvmtiError GetTag(jobject object,\r\n            jlong* tag_ptr) {\r\n    return functions->GetTag(this, object, tag_ptr);\r\n  }\r\n\r\n  jvmtiError SetTag(jobject object,\r\n            jlong tag) {\r\n    return functions->SetTag(this, object, tag);\r\n  }\r\n\r\n  jvmtiError GetObjectsWithTags(jint tag_count,\r\n            const jlong* tags,\r\n            jint* count_ptr,\r\n            jobject** object_result_ptr,\r\n            jlong** tag_result_ptr) {\r\n    return functions->GetObjectsWithTags(this, tag_count, tags, count_ptr, object_result_ptr, tag_result_ptr);\r\n  }\r\n\r\n  jvmtiError ForceGarbageCollection() {\r\n    return functions->ForceGarbageCollection(this);\r\n  }\r\n\r\n  jvmtiError IterateOverObjectsReachableFromObject(jobject object,\r\n            jvmtiObjectReferenceCallback object_reference_callback,\r\n            const void* user_data) {\r\n    return functions->IterateOverObjectsReachableFromObject(this, object, object_reference_callback, user_data);\r\n  }\r\n\r\n  jvmtiError IterateOverReachableObjects(jvmtiHeapRootCallback heap_root_callback,\r\n            jvmtiStackReferenceCallback stack_ref_callback,\r\n            jvmtiObjectReferenceCallback object_ref_callback,\r\n            const void* user_data) {\r\n    return functions->IterateOverReachableObjects(this, heap_root_callback, stack_ref_callback, object_ref_callback, user_data);\r\n  }\r\n\r\n  jvmtiError IterateOverHeap(jvmtiHeapObjectFilter object_filter,\r\n            jvmtiHeapObjectCallback heap_object_callback,\r\n            const void* user_data) {\r\n    return functions->IterateOverHeap(this, object_filter, heap_object_callback, user_data);\r\n  }\r\n\r\n  jvmtiError IterateOverInstancesOfClass(jclass klass,\r\n            jvmtiHeapObjectFilter object_filter,\r\n            jvmtiHeapObjectCallback heap_object_callback,\r\n            const void* user_data) {\r\n    return functions->IterateOverInstancesOfClass(this, klass, object_filter, heap_object_callback, user_data);\r\n  }\r\n\r\n  jvmtiError GetLocalObject(jthread thread,\r\n            jint depth,\r\n            jint slot,\r\n            jobject* value_ptr) {\r\n    return functions->GetLocalObject(this, thread, depth, slot, value_ptr);\r\n  }\r\n\r\n  jvmtiError GetLocalInstance(jthread thread,\r\n            jint depth,\r\n            jobject* value_ptr) {\r\n    return functions->GetLocalInstance(this, thread, depth, value_ptr);\r\n  }\r\n\r\n  jvmtiError GetLocalInt(jthread thread,\r\n            jint depth,\r\n            jint slot,\r\n            jint* value_ptr) {\r\n    return functions->GetLocalInt(this, thread, depth, slot, value_ptr);\r\n  }\r\n\r\n  jvmtiError GetLocalLong(jthread thread,\r\n            jint depth,\r\n            jint slot,\r\n            jlong* value_ptr) {\r\n    return functions->GetLocalLong(this, thread, depth, slot, value_ptr);\r\n  }\r\n\r\n  jvmtiError GetLocalFloat(jthread thread,\r\n            jint depth,\r\n            jint slot,\r\n            jfloat* value_ptr) {\r\n    return functions->GetLocalFloat(this, thread, depth, slot, value_ptr);\r\n  }\r\n\r\n  jvmtiError GetLocalDouble(jthread thread,\r\n            jint depth,\r\n            jint slot,\r\n            jdouble* value_ptr) {\r\n    return functions->GetLocalDouble(this, thread, depth, slot, value_ptr);\r\n  }\r\n\r\n  jvmtiError SetLocalObject(jthread thread,\r\n            jint depth,\r\n            jint slot,\r\n            jobject value) {\r\n    return functions->SetLocalObject(this, thread, depth, slot, value);\r\n  }\r\n\r\n  jvmtiError SetLocalInt(jthread thread,\r\n            jint depth,\r\n            jint slot,\r\n            jint value) {\r\n    return functions->SetLocalInt(this, thread, depth, slot, value);\r\n  }\r\n\r\n  jvmtiError SetLocalLong(jthread thread,\r\n            jint depth,\r\n            jint slot,\r\n            jlong value) {\r\n    return functions->SetLocalLong(this, thread, depth, slot, value);\r\n  }\r\n\r\n  jvmtiError SetLocalFloat(jthread thread,\r\n            jint depth,\r\n            jint slot,\r\n            jfloat value) {\r\n    return functions->SetLocalFloat(this, thread, depth, slot, value);\r\n  }\r\n\r\n  jvmtiError SetLocalDouble(jthread thread,\r\n            jint depth,\r\n            jint slot,\r\n            jdouble value) {\r\n    return functions->SetLocalDouble(this, thread, depth, slot, value);\r\n  }\r\n\r\n  jvmtiError SetBreakpoint(jmethodID method,\r\n            jlocation location) {\r\n    return functions->SetBreakpoint(this, method, location);\r\n  }\r\n\r\n  jvmtiError ClearBreakpoint(jmethodID method,\r\n            jlocation location) {\r\n    return functions->ClearBreakpoint(this, method, location);\r\n  }\r\n\r\n  jvmtiError SetFieldAccessWatch(jclass klass,\r\n            jfieldID field) {\r\n    return functions->SetFieldAccessWatch(this, klass, field);\r\n  }\r\n\r\n  jvmtiError ClearFieldAccessWatch(jclass klass,\r\n            jfieldID field) {\r\n    return functions->ClearFieldAccessWatch(this, klass, field);\r\n  }\r\n\r\n  jvmtiError SetFieldModificationWatch(jclass klass,\r\n            jfieldID field) {\r\n    return functions->SetFieldModificationWatch(this, klass, field);\r\n  }\r\n\r\n  jvmtiError ClearFieldModificationWatch(jclass klass,\r\n            jfieldID field) {\r\n    return functions->ClearFieldModificationWatch(this, klass, field);\r\n  }\r\n\r\n  jvmtiError GetLoadedClasses(jint* class_count_ptr,\r\n            jclass** classes_ptr) {\r\n    return functions->GetLoadedClasses(this, class_count_ptr, classes_ptr);\r\n  }\r\n\r\n  jvmtiError GetClassLoaderClasses(jobject initiating_loader,\r\n            jint* class_count_ptr,\r\n            jclass** classes_ptr) {\r\n    return functions->GetClassLoaderClasses(this, initiating_loader, class_count_ptr, classes_ptr);\r\n  }\r\n\r\n  jvmtiError GetClassSignature(jclass klass,\r\n            char** signature_ptr,\r\n            char** generic_ptr) {\r\n    return functions->GetClassSignature(this, klass, signature_ptr, generic_ptr);\r\n  }\r\n\r\n  jvmtiError GetClassStatus(jclass klass,\r\n            jint* status_ptr) {\r\n    return functions->GetClassStatus(this, klass, status_ptr);\r\n  }\r\n\r\n  jvmtiError GetSourceFileName(jclass klass,\r\n            char** source_name_ptr) {\r\n    return functions->GetSourceFileName(this, klass, source_name_ptr);\r\n  }\r\n\r\n  jvmtiError GetClassModifiers(jclass klass,\r\n            jint* modifiers_ptr) {\r\n    return functions->GetClassModifiers(this, klass, modifiers_ptr);\r\n  }\r\n\r\n  jvmtiError GetClassMethods(jclass klass,\r\n            jint* method_count_ptr,\r\n            jmethodID** methods_ptr) {\r\n    return functions->GetClassMethods(this, klass, method_count_ptr, methods_ptr);\r\n  }\r\n\r\n  jvmtiError GetClassFields(jclass klass,\r\n            jint* field_count_ptr,\r\n            jfieldID** fields_ptr) {\r\n    return functions->GetClassFields(this, klass, field_count_ptr, fields_ptr);\r\n  }\r\n\r\n  jvmtiError GetImplementedInterfaces(jclass klass,\r\n            jint* interface_count_ptr,\r\n            jclass** interfaces_ptr) {\r\n    return functions->GetImplementedInterfaces(this, klass, interface_count_ptr, interfaces_ptr);\r\n  }\r\n\r\n  jvmtiError GetClassVersionNumbers(jclass klass,\r\n            jint* minor_version_ptr,\r\n            jint* major_version_ptr) {\r\n    return functions->GetClassVersionNumbers(this, klass, minor_version_ptr, major_version_ptr);\r\n  }\r\n\r\n  jvmtiError GetConstantPool(jclass klass,\r\n            jint* constant_pool_count_ptr,\r\n            jint* constant_pool_byte_count_ptr,\r\n            unsigned char** constant_pool_bytes_ptr) {\r\n    return functions->GetConstantPool(this, klass, constant_pool_count_ptr, constant_pool_byte_count_ptr, constant_pool_bytes_ptr);\r\n  }\r\n\r\n  jvmtiError IsInterface(jclass klass,\r\n            jboolean* is_interface_ptr) {\r\n    return functions->IsInterface(this, klass, is_interface_ptr);\r\n  }\r\n\r\n  jvmtiError IsArrayClass(jclass klass,\r\n            jboolean* is_array_class_ptr) {\r\n    return functions->IsArrayClass(this, klass, is_array_class_ptr);\r\n  }\r\n\r\n  jvmtiError IsModifiableClass(jclass klass,\r\n            jboolean* is_modifiable_class_ptr) {\r\n    return functions->IsModifiableClass(this, klass, is_modifiable_class_ptr);\r\n  }\r\n\r\n  jvmtiError GetClassLoader(jclass klass,\r\n            jobject* classloader_ptr) {\r\n    return functions->GetClassLoader(this, klass, classloader_ptr);\r\n  }\r\n\r\n  jvmtiError GetSourceDebugExtension(jclass klass,\r\n            char** source_debug_extension_ptr) {\r\n    return functions->GetSourceDebugExtension(this, klass, source_debug_extension_ptr);\r\n  }\r\n\r\n  jvmtiError RetransformClasses(jint class_count,\r\n            const jclass* classes) {\r\n    return functions->RetransformClasses(this, class_count, classes);\r\n  }\r\n\r\n  jvmtiError RedefineClasses(jint class_count,\r\n            const jvmtiClassDefinition* class_definitions) {\r\n    return functions->RedefineClasses(this, class_count, class_definitions);\r\n  }\r\n\r\n  jvmtiError GetObjectSize(jobject object,\r\n            jlong* size_ptr) {\r\n    return functions->GetObjectSize(this, object, size_ptr);\r\n  }\r\n\r\n  jvmtiError GetObjectHashCode(jobject object,\r\n            jint* hash_code_ptr) {\r\n    return functions->GetObjectHashCode(this, object, hash_code_ptr);\r\n  }\r\n\r\n  jvmtiError GetObjectMonitorUsage(jobject object,\r\n            jvmtiMonitorUsage* info_ptr) {\r\n    return functions->GetObjectMonitorUsage(this, object, info_ptr);\r\n  }\r\n\r\n  jvmtiError GetFieldName(jclass klass,\r\n            jfieldID field,\r\n            char** name_ptr,\r\n            char** signature_ptr,\r\n            char** generic_ptr) {\r\n    return functions->GetFieldName(this, klass, field, name_ptr, signature_ptr, generic_ptr);\r\n  }\r\n\r\n  jvmtiError GetFieldDeclaringClass(jclass klass,\r\n            jfieldID field,\r\n            jclass* declaring_class_ptr) {\r\n    return functions->GetFieldDeclaringClass(this, klass, field, declaring_class_ptr);\r\n  }\r\n\r\n  jvmtiError GetFieldModifiers(jclass klass,\r\n            jfieldID field,\r\n            jint* modifiers_ptr) {\r\n    return functions->GetFieldModifiers(this, klass, field, modifiers_ptr);\r\n  }\r\n\r\n  jvmtiError IsFieldSynthetic(jclass klass,\r\n            jfieldID field,\r\n            jboolean* is_synthetic_ptr) {\r\n    return functions->IsFieldSynthetic(this, klass, field, is_synthetic_ptr);\r\n  }\r\n\r\n  jvmtiError GetMethodName(jmethodID method,\r\n            char** name_ptr,\r\n            char** signature_ptr,\r\n            char** generic_ptr) {\r\n    return functions->GetMethodName(this, method, name_ptr, signature_ptr, generic_ptr);\r\n  }\r\n\r\n  jvmtiError GetMethodDeclaringClass(jmethodID method,\r\n            jclass* declaring_class_ptr) {\r\n    return functions->GetMethodDeclaringClass(this, method, declaring_class_ptr);\r\n  }\r\n\r\n  jvmtiError GetMethodModifiers(jmethodID method,\r\n            jint* modifiers_ptr) {\r\n    return functions->GetMethodModifiers(this, method, modifiers_ptr);\r\n  }\r\n\r\n  jvmtiError GetMaxLocals(jmethodID method,\r\n            jint* max_ptr) {\r\n    return functions->GetMaxLocals(this, method, max_ptr);\r\n  }\r\n\r\n  jvmtiError GetArgumentsSize(jmethodID method,\r\n            jint* size_ptr) {\r\n    return functions->GetArgumentsSize(this, method, size_ptr);\r\n  }\r\n\r\n  jvmtiError GetLineNumberTable(jmethodID method,\r\n            jint* entry_count_ptr,\r\n            jvmtiLineNumberEntry** table_ptr) {\r\n    return functions->GetLineNumberTable(this, method, entry_count_ptr, table_ptr);\r\n  }\r\n\r\n  jvmtiError GetMethodLocation(jmethodID method,\r\n            jlocation* start_location_ptr,\r\n            jlocation* end_location_ptr) {\r\n    return functions->GetMethodLocation(this, method, start_location_ptr, end_location_ptr);\r\n  }\r\n\r\n  jvmtiError GetLocalVariableTable(jmethodID method,\r\n            jint* entry_count_ptr,\r\n            jvmtiLocalVariableEntry** table_ptr) {\r\n    return functions->GetLocalVariableTable(this, method, entry_count_ptr, table_ptr);\r\n  }\r\n\r\n  jvmtiError GetBytecodes(jmethodID method,\r\n            jint* bytecode_count_ptr,\r\n            unsigned char** bytecodes_ptr) {\r\n    return functions->GetBytecodes(this, method, bytecode_count_ptr, bytecodes_ptr);\r\n  }\r\n\r\n  jvmtiError IsMethodNative(jmethodID method,\r\n            jboolean* is_native_ptr) {\r\n    return functions->IsMethodNative(this, method, is_native_ptr);\r\n  }\r\n\r\n  jvmtiError IsMethodSynthetic(jmethodID method,\r\n            jboolean* is_synthetic_ptr) {\r\n    return functions->IsMethodSynthetic(this, method, is_synthetic_ptr);\r\n  }\r\n\r\n  jvmtiError IsMethodObsolete(jmethodID method,\r\n            jboolean* is_obsolete_ptr) {\r\n    return functions->IsMethodObsolete(this, method, is_obsolete_ptr);\r\n  }\r\n\r\n  jvmtiError SetNativeMethodPrefix(const char* prefix) {\r\n    return functions->SetNativeMethodPrefix(this, prefix);\r\n  }\r\n\r\n  jvmtiError SetNativeMethodPrefixes(jint prefix_count,\r\n            char** prefixes) {\r\n    return functions->SetNativeMethodPrefixes(this, prefix_count, prefixes);\r\n  }\r\n\r\n  jvmtiError CreateRawMonitor(const char* name,\r\n            jrawMonitorID* monitor_ptr) {\r\n    return functions->CreateRawMonitor(this, name, monitor_ptr);\r\n  }\r\n\r\n  jvmtiError DestroyRawMonitor(jrawMonitorID monitor) {\r\n    return functions->DestroyRawMonitor(this, monitor);\r\n  }\r\n\r\n  jvmtiError RawMonitorEnter(jrawMonitorID monitor) {\r\n    return functions->RawMonitorEnter(this, monitor);\r\n  }\r\n\r\n  jvmtiError RawMonitorExit(jrawMonitorID monitor) {\r\n    return functions->RawMonitorExit(this, monitor);\r\n  }\r\n\r\n  jvmtiError RawMonitorWait(jrawMonitorID monitor,\r\n            jlong millis) {\r\n    return functions->RawMonitorWait(this, monitor, millis);\r\n  }\r\n\r\n  jvmtiError RawMonitorNotify(jrawMonitorID monitor) {\r\n    return functions->RawMonitorNotify(this, monitor);\r\n  }\r\n\r\n  jvmtiError RawMonitorNotifyAll(jrawMonitorID monitor) {\r\n    return functions->RawMonitorNotifyAll(this, monitor);\r\n  }\r\n\r\n  jvmtiError SetJNIFunctionTable(const jniNativeInterface* function_table) {\r\n    return functions->SetJNIFunctionTable(this, function_table);\r\n  }\r\n\r\n  jvmtiError GetJNIFunctionTable(jniNativeInterface** function_table) {\r\n    return functions->GetJNIFunctionTable(this, function_table);\r\n  }\r\n\r\n  jvmtiError SetEventCallbacks(const jvmtiEventCallbacks* callbacks,\r\n            jint size_of_callbacks) {\r\n    return functions->SetEventCallbacks(this, callbacks, size_of_callbacks);\r\n  }\r\n\r\n  jvmtiError SetEventNotificationMode(jvmtiEventMode mode,\r\n            jvmtiEvent event_type,\r\n            jthread event_thread,\r\n             ...) {\r\n    return functions->SetEventNotificationMode(this, mode, event_type, event_thread);\r\n  }\r\n\r\n  jvmtiError GenerateEvents(jvmtiEvent event_type) {\r\n    return functions->GenerateEvents(this, event_type);\r\n  }\r\n\r\n  jvmtiError GetExtensionFunctions(jint* extension_count_ptr,\r\n            jvmtiExtensionFunctionInfo** extensions) {\r\n    return functions->GetExtensionFunctions(this, extension_count_ptr, extensions);\r\n  }\r\n\r\n  jvmtiError GetExtensionEvents(jint* extension_count_ptr,\r\n            jvmtiExtensionEventInfo** extensions) {\r\n    return functions->GetExtensionEvents(this, extension_count_ptr, extensions);\r\n  }\r\n\r\n  jvmtiError SetExtensionEventCallback(jint extension_event_index,\r\n            jvmtiExtensionEvent callback) {\r\n    return functions->SetExtensionEventCallback(this, extension_event_index, callback);\r\n  }\r\n\r\n  jvmtiError GetPotentialCapabilities(jvmtiCapabilities* capabilities_ptr) {\r\n    return functions->GetPotentialCapabilities(this, capabilities_ptr);\r\n  }\r\n\r\n  jvmtiError AddCapabilities(const jvmtiCapabilities* capabilities_ptr) {\r\n    return functions->AddCapabilities(this, capabilities_ptr);\r\n  }\r\n\r\n  jvmtiError RelinquishCapabilities(const jvmtiCapabilities* capabilities_ptr) {\r\n    return functions->RelinquishCapabilities(this, capabilities_ptr);\r\n  }\r\n\r\n  jvmtiError GetCapabilities(jvmtiCapabilities* capabilities_ptr) {\r\n    return functions->GetCapabilities(this, capabilities_ptr);\r\n  }\r\n\r\n  jvmtiError GetCurrentThreadCpuTimerInfo(jvmtiTimerInfo* info_ptr) {\r\n    return functions->GetCurrentThreadCpuTimerInfo(this, info_ptr);\r\n  }\r\n\r\n  jvmtiError GetCurrentThreadCpuTime(jlong* nanos_ptr) {\r\n    return functions->GetCurrentThreadCpuTime(this, nanos_ptr);\r\n  }\r\n\r\n  jvmtiError GetThreadCpuTimerInfo(jvmtiTimerInfo* info_ptr) {\r\n    return functions->GetThreadCpuTimerInfo(this, info_ptr);\r\n  }\r\n\r\n  jvmtiError GetThreadCpuTime(jthread thread,\r\n            jlong* nanos_ptr) {\r\n    return functions->GetThreadCpuTime(this, thread, nanos_ptr);\r\n  }\r\n\r\n  jvmtiError GetTimerInfo(jvmtiTimerInfo* info_ptr) {\r\n    return functions->GetTimerInfo(this, info_ptr);\r\n  }\r\n\r\n  jvmtiError GetTime(jlong* nanos_ptr) {\r\n    return functions->GetTime(this, nanos_ptr);\r\n  }\r\n\r\n  jvmtiError GetAvailableProcessors(jint* processor_count_ptr) {\r\n    return functions->GetAvailableProcessors(this, processor_count_ptr);\r\n  }\r\n\r\n  jvmtiError AddToBootstrapClassLoaderSearch(const char* segment) {\r\n    return functions->AddToBootstrapClassLoaderSearch(this, segment);\r\n  }\r\n\r\n  jvmtiError AddToSystemClassLoaderSearch(const char* segment) {\r\n    return functions->AddToSystemClassLoaderSearch(this, segment);\r\n  }\r\n\r\n  jvmtiError GetSystemProperties(jint* count_ptr,\r\n            char*** property_ptr) {\r\n    return functions->GetSystemProperties(this, count_ptr, property_ptr);\r\n  }\r\n\r\n  jvmtiError GetSystemProperty(const char* property,\r\n            char** value_ptr) {\r\n    return functions->GetSystemProperty(this, property, value_ptr);\r\n  }\r\n\r\n  jvmtiError SetSystemProperty(const char* property,\r\n            const char* value) {\r\n    return functions->SetSystemProperty(this, property, value);\r\n  }\r\n\r\n  jvmtiError GetPhase(jvmtiPhase* phase_ptr) {\r\n    return functions->GetPhase(this, phase_ptr);\r\n  }\r\n\r\n  jvmtiError DisposeEnvironment() {\r\n    return functions->DisposeEnvironment(this);\r\n  }\r\n\r\n  jvmtiError SetEnvironmentLocalStorage(const void* data) {\r\n    return functions->SetEnvironmentLocalStorage(this, data);\r\n  }\r\n\r\n  jvmtiError GetEnvironmentLocalStorage(void** data_ptr) {\r\n    return functions->GetEnvironmentLocalStorage(this, data_ptr);\r\n  }\r\n\r\n  jvmtiError GetVersionNumber(jint* version_ptr) {\r\n    return functions->GetVersionNumber(this, version_ptr);\r\n  }\r\n\r\n  jvmtiError GetErrorName(jvmtiError error,\r\n            char** name_ptr) {\r\n    return functions->GetErrorName(this, error, name_ptr);\r\n  }\r\n\r\n  jvmtiError SetVerboseFlag(jvmtiVerboseFlag flag,\r\n            jboolean value) {\r\n    return functions->SetVerboseFlag(this, flag, value);\r\n  }\r\n\r\n  jvmtiError GetJLocationFormat(jvmtiJlocationFormat* format_ptr) {\r\n    return functions->GetJLocationFormat(this, format_ptr);\r\n  }\r\n\r\n#endif /* __cplusplus */\r\n};\r\n\r\n\r\n#ifdef __cplusplus\r\n} /* extern \"C\" */\r\n#endif /* __cplusplus */\r\n\r\n#endif /* !_JAVA_JVMTI_H_ */\r\n\r\n"
  },
  {
    "path": "native-src/main.cpp",
    "content": "#include <windows.h>\r\n\r\n#include \"injector.h\"\r\n#include \"utils.h\"\r\n\r\nstatic DWORD RunInjectorThreadProxy(LPVOID) {\r\n  RunInjector();\r\n  return 1;\r\n}\r\n\r\nBOOL WINAPI DllMain(HINSTANCE dll_instance, DWORD reason, LPVOID reserved) {\r\n  if (reason == DLL_PROCESS_ATTACH) {\r\n    ::global_dll_instance = dll_instance;\r\n    CreateThread(nullptr, 0, &RunInjectorThreadProxy, nullptr, 0, nullptr);\r\n  }\r\n  return TRUE;\r\n}\r\n"
  },
  {
    "path": "native-src/stub_classes/injector.h",
    "content": "#ifndef STUB_CLASSES_INJECTOR_H_\r\n#define STUB_CLASSES_INJECTOR_H_\r\n\r\n#include \"../jvm/jni.h\"\r\n\r\nconst jbyte injector_class_data[] = {0x00};\r\n\r\n#endif  //STUB_CLASSES_INJECTOR_H_\r\n"
  },
  {
    "path": "native-src/stub_classes/jar.h",
    "content": "#ifndef STUB_CLASSES_JAR_H_\r\n#define STUB_CLASSES_JAR_H_\r\n\r\n#include \"../jvm/jni.h\"\r\n\r\nconst jbyte test_class_1[] = {0x01, 0x02, 0x03};\r\n\r\nconst jbyte* jar_classes_data[] = {test_class_1};\r\nconst jsize jar_classes_sizes[] = {3};\r\n\r\n#endif  //STUB_CLASSES_JAR_H_\r\n"
  },
  {
    "path": "native-src/utils.cpp",
    "content": "#include \"utils.h\"\r\n\r\n#include <windows.h>\r\n#include <winuser.h>\r\n\r\nHMODULE global_dll_instance = nullptr;\r\n\r\nvoid ShowMessage(const wchar_t* message) {\r\n  MessageBoxW(nullptr, message, L\"JarToDllInjector\", MB_OK | MB_ICONINFORMATION);\r\n}\r\n\r\nvoid Error(const wchar_t* error) {\r\n  DWORD last_status_code = GetLastError();\r\n  wchar_t second_message[256] = {};\r\n  wsprintfW(second_message, L\"Last error code: %u\", last_status_code);\r\n  MessageBoxW(nullptr, error, L\"JarToDllInjector\", MB_OK | MB_ICONEXCLAMATION);\r\n  MessageBoxW(nullptr, second_message, L\"JarToDllInjector\", MB_OK | MB_ICONEXCLAMATION);\r\n  FreeLibraryAndExitThread(global_dll_instance, 1);\r\n}"
  },
  {
    "path": "native-src/utils.h",
    "content": "#ifndef UTILS_H_\r\n#define UTILS_H_\r\n\r\n#include <windows.h>\r\n\r\nextern HMODULE global_dll_instance;\r\n\r\nvoid ShowMessage(const wchar_t* message);\r\nvoid Error(const wchar_t* error);\r\n\r\n#endif  //UTILS_H_\r\n"
  }
]