C++ Вопрос Как дефайнить не один класс, а несколько? [C++ JNI]

Забаненный
Статус
Оффлайн
Регистрация
30 Июл 2023
Сообщения
49
Реакции[?]
0
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
jenv->DefineClass дефайнит только по одному классу, я хочу загрузить целую джарку из классов, а создавать для каждого класса массив байтов это такое себе учитывая, что у меня 400+ классов. Так как же загружать сразу много классов по байтам?
 
ппоршень
Пользователь
Статус
Оффлайн
Регистрация
15 Фев 2020
Сообщения
278
Реакции[?]
49
Поинты[?]
38K
jenv->DefineClass дефайнит только по одному классу, я хочу загрузить целую джарку из классов, а создавать для каждого класса массив байтов это такое себе учитывая, что у меня 400+ классов. Так как же загружать сразу много классов по байтам?
сделай map в котором будут пути до твоих классов и пакейжи, читай байты через ifstream и дефайни
 
Начинающий
Статус
Оффлайн
Регистрация
10 Май 2023
Сообщения
60
Реакции[?]
3
Поинты[?]
3K
ппоршень
Пользователь
Статус
Оффлайн
Регистрация
15 Фев 2020
Сообщения
278
Реакции[?]
49
Поинты[?]
38K
вот тебе самый простой парсер и подгрузчик, дальше разберешься сам
JavaScript:
var {readdirSync, readFileSync, writeFileSync}=require("fs");
var {join,resolve}=require("path")

var readrec=(path,paths)=>{
    readdirSync(path,{withFileTypes:true}).forEach(v=>{
        if(v.isDirectory()) return readrec(join(path,v.name),paths)
        if(v.name.endsWith('.class'))paths.push(join(path,v.name))
    })
    return paths
}
var paths=readrec('.',[])
var bytes=paths.map(v=>`{"${v.split('\\').join('/').replace('.class','')}",{"${resolve(v).replaceAll(`\\`,`\\\\`)}"}}`)
writeFileSync('klasses.cpp',`#include "klassloader.h"
std::map<std::string,std::string> klassloader::g_mKlasses={${bytes.join(',\n')}};`)
C++:
for ( auto &klass:klassloader::g_mKlasses ) {
    std::ifstream sKlass( klass.second, std::ios::binary | std::ios::ate );
    printf( "mapping... (%i/%d)  \r", counter, klassloader::g_mKlasses.size( )+1 );
    if ( sKlass.fail( ) ) {
        printf( "unable to map %s\n", klass.first.c_str( ) );
        failed++;
        counter++;
        continue;
    }
    auto szKlass = sKlass.tellg( );
    jbyte *pKlass = new jbyte[ ( UINT_PTR )szKlass ];
    if ( !pKlass ) {
        printf( "unable to map %s\n", klass.first.c_str( ) );
        failed++;
        counter++;
        continue;
    }

    sKlass.seekg( 0, std::ios::beg );
    sKlass.read( ( char * )( pKlass ), szKlass );
    sKlass.close( );

    klassloader::loadklass( env, pKlass, szKlass, klass.first );

    delete[ ] pKlass;

    counter++;
}
 
ЧВК EB_LAN
Забаненный
Статус
Оффлайн
Регистрация
12 Сен 2021
Сообщения
425
Реакции[?]
121
Поинты[?]
162K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Сверху Снизу