* Android NDK JNI directorio notas de entrada *
tipos de datos básicos de Java y JNI
Java tipos de datos básicos incluyen boolean, byte, char, short, int, long, float, double estos tipos.
Mientras que el código nativo escrito en C / C ++, Java no puede utilizar directamente el tipo de datos.
Así JNI proporciona jboolean, jbyte, jchar, jshort, jint, jlong, jfloat, jdouble.
JNI Java tipos de datos básicos y relación de proyección de tipo de datos
Tipo de Java | Tipo nativa | Descripción |
---|---|---|
booleano | jboolean | sin signo de 8 bits |
byte | jbyte | firmados 8 bits |
carbonizarse | jchar | sin signo de 16 bits |
corto | jshort | firmado 16 bits |
En t | jint | firmado 32 bits |
largo | jlong | firmado 64 bits |
flotador | jfloat | 32 bits |
doble | jdouble | 64 bits |
vacío | vacío | N / A |
Los tipos de datos básicos pasaron - Proyecto de Práctica
Java -> Nativo
Haga clic en cada botón, el Java transmitido a los tipos de datos básicos nativo, código nativo (C / C ++) en los datos de impresión en el registro.
JavaToNativeActivity.java
public class JavaToNativeActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_java_to_native);
setTitle("Java -> Native");
}
public void booleanTest(View view) {
NativeUtil.javaBooleanToNative(true);
NativeUtil.javaBooleanToNative(false);
}
public void byteTest(View view) {
NativeUtil.javaByteToNative(Byte.MIN_VALUE);
NativeUtil.javaByteToNative(Byte.MAX_VALUE);
NativeUtil.javaByteToNative(Byte.parseByte("123"));
}
public void charTest(View view) {
NativeUtil.javaCharToNative(Character.MIN_VALUE);
NativeUtil.javaCharToNative(Character.MAX_VALUE);
NativeUtil.javaCharToNative('A');
NativeUtil.javaCharToNative('B');
NativeUtil.javaCharToNative('C');
}
public void shortTest(View view) {
NativeUtil.javaShortToNative(Short.MIN_VALUE);
NativeUtil.javaShortToNative(Short.MAX_VALUE);
NativeUtil.javaShortToNative(Short.parseShort("999"));
}
public void intTest(View view) {
NativeUtil.javaIntToNative(Integer.MIN_VALUE);
NativeUtil.javaIntToNative(Integer.MAX_VALUE);
NativeUtil.javaIntToNative(Integer.parseInt("999999"));
}
public void longTest(View view) {
NativeUtil.javaLongToNative(Long.MIN_VALUE);
NativeUtil.javaLongToNative(Long.MAX_VALUE);
NativeUtil.javaLongToNative(Long.parseLong("999999999"));
}
public void floatTest(View view) {
NativeUtil.javaFloatToNative(Float.MIN_VALUE);
NativeUtil.javaFloatToNative(Float.MAX_VALUE);
NativeUtil.javaFloatToNative(999999.8F);
}
public void doubleTest(View view) {
NativeUtil.javaDoubleToNative(Double.MIN_NORMAL);
NativeUtil.javaDoubleToNative(Double.MAX_VALUE);
NativeUtil.javaDoubleToNative(999999999.8);
}
}
NativeUtil.java
public class NativeUtil {
static {
System.loadLibrary("native-lib");
}
public native static void javaBooleanToNative(boolean value);
public native static void javaByteToNative(byte value);
public native static void javaCharToNative(char value);
public native static void javaShortToNative(short value);
public native static void javaIntToNative(int value);
public native static void javaLongToNative(long value);
public native static void javaFloatToNative(float value);
public native static void javaDoubleToNative(double value);
}
nativo-lib.cpp
#include <jni.h>
#include <string>
#include <android/log.h>
#include <math.h>
#define LOG_TAG "C_TAG"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
//LOGD("hello.length=%d",helloLen);
extern "C"
JNIEXPORT void JNICALL
Java_com_ihubin_ndkjni_NativeUtil_javaBooleanToNative(JNIEnv *env, jclass clazz, jboolean value) {
LOGD("Java Boolean: %d", value);
}
extern "C"
JNIEXPORT void JNICALL
Java_com_ihubin_ndkjni_NativeUtil_javaByteToNative(JNIEnv *env, jclass clazz, jbyte value) {
LOGD("Java Byte: %d", value);
}
extern "C"
JNIEXPORT void JNICALL
Java_com_ihubin_ndkjni_NativeUtil_javaCharToNative(JNIEnv *env, jclass clazz, jchar value) {
LOGD("Java Char: %d", value);
}
extern "C"
JNIEXPORT void JNICALL
Java_com_ihubin_ndkjni_NativeUtil_javaShortToNative(JNIEnv *env, jclass clazz, jshort value) {
LOGD("Java Short: %d", value);
}
extern "C"
JNIEXPORT void JNICALL
Java_com_ihubin_ndkjni_NativeUtil_javaIntToNative(JNIEnv *env, jclass clazz, jint value) {
LOGD("Java Int: %d", value);
}
extern "C"
JNIEXPORT void JNICALL
Java_com_ihubin_ndkjni_NativeUtil_javaLongToNative(JNIEnv *env, jclass clazz, jlong value) {
LOGD("Java Long: %lld", value);
}
extern "C"
JNIEXPORT void JNICALL
Java_com_ihubin_ndkjni_NativeUtil_javaFloatToNative(JNIEnv *env, jclass clazz, jfloat value) {
LOGD("Java Float: %f", value);
}
extern "C"
JNIEXPORT void JNICALL
Java_com_ihubin_ndkjni_NativeUtil_javaDoubleToNative(JNIEnv *env, jclass clazz, jdouble value) {
LOGD("Java Double: %lf", value);
}
Haga clic en cada botón para ver la salida del registro en el Logcat
D/C_TAG: Java Boolean: 1
D/C_TAG: Java Boolean: 0
D/C_TAG: Java Byte: -128
D/C_TAG: Java Byte: 127
Java Byte: 123
D/C_TAG: Java Char: 0
Java Char: 65535
Java Char: 65
Java Char: 66
Java Char: 67
D/C_TAG: Java Short: -32768
D/C_TAG: Java Short: 32767
Java Short: 999
D/C_TAG: Java Int: -2147483648
Java Int: 2147483647
Java Int: 999999
D/C_TAG: Java Long: -9223372036854775808
Java Long: 9223372036854775807
Java Long: 999999999
D/C_TAG: Java Float: 0.000000
Java Float: 340282346638528859811704183484516925440.000000
Java Float: 999999.812500
D/C_TAG: Java Double: 0.000000
Java Double: 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000
Java Double: 999999999.800000
Java <- Navive
Haga clic en cada botón para ver los tipos de datos básicos de Java de código nativo (C / C ++) son de.
NativeToJavaActivity.java
public class NativeToJavaActivity extends AppCompatActivity {
private TextView booleanText;
private TextView byteText;
private TextView charText;
private TextView shortText;
private TextView intText;
private TextView longText;
private TextView floatText;
private TextView doubleText;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_native_to_java);
setTitle("Native -> Java");
booleanText = findViewById(R.id.boolean_text);
byteText = findViewById(R.id.byte_text);
charText = findViewById(R.id.char_text);
shortText = findViewById(R.id.short_text);
intText = findViewById(R.id.int_text);
longText = findViewById(R.id.long_text);
floatText = findViewById(R.id.float_text);
doubleText = findViewById(R.id.double_text);
}
public void booleanTest(View view) {
boolean value = NativeUtil.javaBooleanFromNative();
booleanText.setText("value = " + value);
}
public void byteTest(View view) {
byte value = NativeUtil.javaByteFromNative();
byteText.setText("value = " + value);
}
public void charTest(View view) {
char value = NativeUtil.javaCharFromNative();
charText.setText("value = " + value);
}
public void shortTest(View view) {
short value = NativeUtil.javaShortFromNative();
shortText.setText("value = " + value);
}
public void intTest(View view) {
int value = NativeUtil.javaIntFromNative();
intText.setText("value = " + value);
}
public void longTest(View view) {
long value = NativeUtil.javaLongFromNative();
longText.setText("value = " + value);
}
public void floatTest(View view) {
float value = NativeUtil.javaFloatFromNative();
floatText.setText("value = " + value);
}
public void doubleTest(View view) {
double value = NativeUtil.javaDoubleFromNative();
doubleText.setText("value = " + value);
}
}
NativeUtil.java
public class NativeUtil {
static {
System.loadLibrary("native-lib");
}
public native static boolean javaBooleanFromNative();
public native static byte javaByteFromNative();
public native static char javaCharFromNative();
public native static short javaShortFromNative();
public native static int javaIntFromNative();
public native static long javaLongFromNative();
public native static float javaFloatFromNative();
public native static double javaDoubleFromNative();
}
nativo-lib.cpp
#include <jni.h>
#include <string>
#include <android/log.h>
#include <math.h>
#define LOG_TAG "C_TAG"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
//LOGD("hello.length=%d",helloLen);
extern "C"
JNIEXPORT jboolean JNICALL
Java_com_ihubin_ndkjni_NativeUtil_javaBooleanFromNative(JNIEnv *env, jclass clazz) {
return JNI_TRUE;
}
extern "C"
JNIEXPORT jbyte JNICALL
Java_com_ihubin_ndkjni_NativeUtil_javaByteFromNative(JNIEnv *env, jclass clazz) {
return 123;
}
extern "C"
JNIEXPORT jchar JNICALL
Java_com_ihubin_ndkjni_NativeUtil_javaCharFromNative(JNIEnv *env, jclass clazz) {
return 'A';
}
extern "C"
JNIEXPORT jshort JNICALL
Java_com_ihubin_ndkjni_NativeUtil_javaShortFromNative(JNIEnv *env, jclass clazz) {
return 999;
}
extern "C"
JNIEXPORT jint JNICALL
Java_com_ihubin_ndkjni_NativeUtil_javaIntFromNative(JNIEnv *env, jclass clazz) {
return 999999;
}
extern "C"
JNIEXPORT jlong JNICALL
Java_com_ihubin_ndkjni_NativeUtil_javaLongFromNative(JNIEnv *env, jclass clazz) {
return 999999999;
}
extern "C"
JNIEXPORT jfloat JNICALL
Java_com_ihubin_ndkjni_NativeUtil_javaFloatFromNative(JNIEnv *env, jclass clazz) {
return 999999.8;
}
extern "C"
JNIEXPORT jdouble JNICALL
Java_com_ihubin_ndkjni_NativeUtil_javaDoubleFromNative(JNIEnv *env, jclass clazz) {
return 999999999.8;
}
Haga clic en cada botón a ensayar
Java <-> Nativo
Haga clic en cada botón, y la entrega nativo (C / C ++), obtiene los tipos de datos básicos de Java.
JavaNativeActivity.java
public class JavaNativeActivity extends AppCompatActivity {
private TextView charConcatText;
private TextView sumText;
private TextView twoExpText;
private TextView calcMoneyText;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_java_native);
setTitle("Java <-> Native");
charConcatText = findViewById(R.id.char_concat_text);
sumText = findViewById(R.id.sum_text);
twoExpText = findViewById(R.id.two_exp_text);
calcMoneyText = findViewById(R.id.calc_money_text);
}
public void charConcatTest(View view) {
String value = NativeUtil.charConcatTest('A', 'B', 'C');
charConcatText.setText("A+B+C=" + value);
}
public void sumTest(View view) {
int numOne = 123;
int numTwo = 456;
int value = NativeUtil.sumText(numOne, numTwo);
sumText.setText(numOne + "+" + numTwo + "=" + value);
}
public void twoExpTest(View view) {
int value = NativeUtil.twoExpTest(10);
twoExpText.setText("2^10=" + value);
}
public void calcMoneyTest(View view) {
double apple = 12.4;
double banana = 99.8;
double orange = 101.1;
String value = NativeUtil.calcMoneyTest(apple, banana, orange);
calcMoneyText.setText(value);
}
}
NativeUtil.java
public class NativeUtil {
static {
System.loadLibrary("native-lib");
}
public native static String charConcatTest(char a, char b, char c);
public native static int sumText(int i, int j);
public native static int twoExpTest(int exp);
public native static String calcMoneyTest(double v, double v1, double v2);
}
nativo-lib.cpp
#include <jni.h>
#include <string>
#include <android/log.h>
#include <math.h>
#define LOG_TAG "C_TAG"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
//LOGD("hello.length=%d",helloLen);
extern "C"
JNIEXPORT jstring JNICALL
Java_com_ihubin_ndkjni_NativeUtil_charConcatTest(JNIEnv *env, jclass clazz, jchar a, jchar b,
jchar c) {
char charArray[4];
charArray[0] = a;
charArray[1] = b;
charArray[2] = c;
charArray[3] = '\0';
return env->NewStringUTF(charArray);
}
extern "C"
JNIEXPORT jint JNICALL
Java_com_ihubin_ndkjni_NativeUtil_sumText(JNIEnv *env, jclass clazz, jint i, jint j) {
return i + j;
}
extern "C"
JNIEXPORT jint JNICALL
Java_com_ihubin_ndkjni_NativeUtil_twoExpTest(JNIEnv *env, jclass clazz, jint exp) {
return pow(2, exp);
}
extern "C"
JNIEXPORT jstring JNICALL
Java_com_ihubin_ndkjni_NativeUtil_calcMoneyTest(JNIEnv *env, jclass clazz, jdouble v, jdouble v1,
jdouble v2) {
double totalMoney = v + v1 + v2;
char *resultStr = new char();
sprintf(resultStr, "总计:%f", totalMoney);
return env->NewStringUTF(resultStr);
}
Haga clic en cada botón a ensayar
Hasta ahora, hemos aprendido a intercambiar datos con el nativo (C / C ++) en el proyecto Android.
código:
referencias:
Tipos JNI y Estructuras de Datos - Oracle
información de registro de impresión JNI