O idioma Java define diferentes tipos de dados, como os tipos básicos, o dobro, etc., bem como o objeto de classe pai de todas as classes etc. Esses são tipos de nível Java e o processo de processamento usando métodos locais requer seus tipos correspondentes.
Os métodos nativos escritos na camada Java são compilados no bytecode pelo compilador. O bytecode registrará diferentes tipos de parâmetros nos arquivos de classe de acordo com a especificação, como b representa byte, eu representa int, j representa muito, etc., então um método local como segue é registrado como (ljava/lang/objeto; ii) v.
teste nativo estático público (objeto o, int i, int i2);
Os métodos correspondentes acima estão registrados na JVM. Quando executado para ligar para o método local, o tipo de dados local será convertido de acordo com o mapa de tipos, como int-> jint e objeto-> jobject. De fato, Int e Jint são os mesmos em C ++, basta usar o Typedef para definir outro nome. Jobject é um ponteiro. O mecanismo de execução gera um objeto ao executar a lógica da camada Java. Possui uma estrutura de dados especial na camada JVM. O trabalho aqui é um ponteiro para essa estrutura. Quando precisa ser usado, pode ser fundido na estrutura de dados da camada JVM e, em seguida, pode ser operado. Além disso, o OOP é usado na JVM para representar ponteiros de objeto.
| Tipo java | Tipo nativo | valor |
|---|---|---|
| booleano | JBoolean | verdadeiro ou falso |
| byte | JBYTE | -128 ~ 127 |
| Curto | jshort | -Pow (2,15) ~ Pow (2,15) -1 |
| int | Jint | -Pow (2,31) ~ Pow (2,31) -1 |
| longo | JLONG | -Pow (2,63) ~ Pow (2,63) -1 |
| flutuador | jfloat | IEEE754 Número de ponto flutuante padrão de precisão única |
| dobro | JDOUBLE | IEEE754 Número de ponto flutuante de precisão dupla padrão |
| char | Jchar | Caracteres unicode sem assinatura de 16 bits |
Além do mapeamento básico de tipo, outros tipos de objetos na camada Java são tipos de referência, portanto o método local corresponde ao tipo de trabalho. Além disso, também derivará algumas subclasses comumente usadas, como JString, Jclass, etc., como segue,
class _jobject {}; classe _jclass: public _jobject {}; class _jhrowable: public _jobject {}; classe _jString: public _jobject {}; class _jrray: public _jobject {}; _ _JBoolArrayRay: _jarray {}; classe _jCharArray: public _jarray {}; classe _jshorTArray: public _jarray {}; class _jintary: public _jarray {}; class _jlonGarray: public _jarray {}; : public _jarray {}; classe _jobjectArray: public _jarray {};Você pode ver que a classe _jobject é definida, que é uma classe vazia, enquanto outras classes incluem _jclass _jthrowable _jString _jarray, são todos herdados da classe _jobject. Além disso, o tipo de matriz também deriva 9 subclasses, correspondendo à matriz do tipo base e à matriz do tipo de referência, respectivamente.
Depois de definir a classe, defina o alias do ponteiro. Aqui está o tipo de método local. Além disso, essas são definições de C ++. Se for um compilador C, ele usará a STRUT para definir _jobject, não classe.
typedef _jobject *jobject; typedef _jclass *jclass; typedef _jhrowable *jthrowable; typedef _jstring *jstring; typedef _jarray *jrray; typeDeDef _jboolanArray *jBoolanArray; tipEDetef _jbyearArray * * *jcharArray; typedef _jShorTArray *jshorTArray; typedef _jintary *jintary; typedef _jlonnonGray *jlonGArray; typedef _jfloatarray *jfloArray; typedef _jDoSTELAYRAY *JDOUBLAY;
O tipo de referência acima é definido como uma classe vazia. Aqui entendemos a classe vazia em C ++. Geralmente, precisamos definir uma classe vazia nas duas maneiras a seguir.
classe vazia {} struct vazio {}Após a definição acima, o tamanho de uma classe vazia é 1, mas qual é o uso de uma classe vazia se não houver nada? De fato, ele pode ser usado para distinguir diferentes objetos. Diferentes objetos definidos por classes vazias têm endereços diferentes. Objetos operados usando novos também têm diferentes ponteiros. Além disso, classes vazias também podem distinguir diferentes categorias.
Então, como usamos esses mapeamentos de tipo em conexão? Na verdade, é muito simples. A resposta é converter ponteiros. Como mencionado anteriormente, os objetos na camada Java têm uma certa estrutura de dados na JVM, ou seja, use OOP para representar ponteiros de objeto. Em seguida, o trabalho pode ser convertido da seguinte maneira, onde o identificador é o tipo de trabalho.
resultado oop = *reinterpret_cast <oop *> (manipulação);
É muito conveniente processá -lo depois de convertê -lo em OOP. Por exemplo, se você deseja obter alguns metadados relacionados à classe, poderá usar o Klass para obtê-lo.
Acima, os tipos definidos pela camada Java possuem tipos de dados correspondentes no método local. Além disso, o código -fonte da camada Java é compilado no bytecode e salva os tipos correspondentes aos parâmetros do método local. Ao executar a JVM, o tipo correspondente ao método local pode ser convertido de acordo com diferentes tipos. Os tipos definidos pelo método local são todas as classes vazias. A principal função é vincular objetos e distinguir tipos de objetos. Os metadados do objeto ou classe podem ser acessados através da conversão do ponteiro quando necessário.