2011-06-03 15 views
11

El método nativo de dll funciona en Java si el parámetro de entrada es una matriz de bytes - byte []. Si usamos el mismo método desde C# arroja EntryPointNotFoundException.es el byte de Java el mismo que el byte de C#?

¿Es eso debido a byte [] en java y C# son cosas diferentes? y si es así, ¿cómo debo usar la función nativa de C#?

+0

es C# sbyte es lo mismo que byte de Java? – Sergey

+0

sí, ambos están firmados con ancho de 8 bits y rango entre -128 a 127 – evilone

Respuesta

13

Java carece de los tipos sin firmar. En particular, Java carece de un tipo primitivo para un byte sin signo. El tipo de byte de Java está firmado, mientras que el byte de C# no está firmado y Sbyte está firmado.

+1

Pedadicamente, 'char' (y algunos podrían decir' bool') es un tipo sin signo ;-) Pero de lo contrario, sí. Muy cierto. –

6

¿Es eso por byte [] en java y C# son cosas diferentes?

Sí.

  • Endianness: Java almacena cosas internamente como Big Endian, mientras que .NET es Little Endian por defecto.
  • Firmeza: C# bytes no están firmados. Los bytes de Java están firmados.

Ver different results when converting int to byte array - .NET vs Java.

+9

Uh ... * bytes * tienen endianess? –

+1

Ngh, tienes razón, lo arreglaré. Tiempo para dormir ... –

+1

primero, @pst es correcto y los bytes no tienen endianness (por definición). en segundo lugar, la endianidad se puede notar solo cuando los datos se serializan. En JNI/JNA endianness es el mismo que en la plataforma de ejecución. –

2

¿Cuál es la firma de la función nativa? ¿Cómo lo declaras en Java y en C#?

La razón más común para EntryPointNotFoundException es que el nombre de la función está mutilado (especialmente cierto si la función está escrita en C++) o mal escrita.

Otra fuente de problemas son los sufijos 'W' y 'A' para la función WinAPI utilizada para distinguir versiones de funciones ANSI y Unicode. El mecanismo de interconexión .NET puede intentar adivinar el sufijo de la función, por lo que puede ser la fuente de confusión,