JNI 中处理 JAVA enum

简介:

原文http://www.cnblogs.com/crazywolf/archive/2011/07/21/2112276.html

学习JAVA已经有段时间,其中非常重要的一环是将原有的C代码用JNI的方式让JAVA去调用。今天解决了一个对enum类型处理的问题。

原理很简单,enum 其实也是一个类,那这个类有什么特色呢?

例如我定义了一个类:

 1  public   class  SerialPort {
 2       public   enum  Parity {
 3          None( 0 ),
 4          Odd( 1 ),
 5          Even( 2 ),
 6          Mark( 3 ),
 7          Space( 4 );
 8           private   int  value;
 9           private  Parity( int  value) {
10               this .value  =  value;
11          }
12           public   int  value() {
13               return   this .value;
14          }
15      }
16 
17       public   native   boolean  setParity(Parity parity);
18       public   native  Parity getParity();
19  }

 那么使用 javap -s SerialPort.Parity 可得到:

 Compiled from "SerialPort.java"

public final class SerialPort$Parity extends java.lang.Enum {

public static final SerialPort$Parity None;

  Signature: LSerialPort$Parity; 

 

public static final SerialPort$Parity Odd;

  Signature: LSerialPort$Parity;

public static final SerialPort$Parity Even;

  Signature: LSerialPort$Parity;

public static final SerialPort$Parity Mark;

  Signature: LSerialPort$Parity;

public static final SerialPort$Parity Space;

  Signature: LSerialPort$Parity;
 static {};

 

  Signature: ()V

public int value();

 Signature: ()I

public static SerialPort$Parity[] values();

  Signatue: ()[LSerialPort$Parity;

public static SerialPort$Parity valueOf(java.lang.String);

  Signature: (Ljava/lang/String;)LSerialPort$Parity;

}

看到这里的信息就明朗了,Enum类就是包含多个定义的Enum类本身的静态常量,加上一些自定义的方法。那想要操作它就像操作一般的类一样了。在C代码里可以这样操作即可达到使用Enum类。

jboolean Java_SerialPort_setParity(JNIEnv  * env, jobject obj, jobject parity) {
    jclass clsParity 
=  ( * env) -> GetObjectClass(env, parity);
    jmethodID idValue 
=  ( * env) -> GetMethodID(env, clsParity,  " value " " ()I " );
    gint32 value 
=  ( * env) -> CallIntMethod(env, parity, idValue);
    
if  (serial_port_set_parity(get_port_address(env, obj), (XDSerialPortParity)value))
        
return  JNI_TRUE;
    
return  JNI_FALSE;
}

jobject Java_SerialPort_getParity(JNIEnv 
* env, jobject obj) {
    jclass clrParity 
=  ( * env) -> FindClass(env,  " SerialPort$Parity " );
    jfieldID id 
=  NULL;
    
switch  (serial_port_get_parity(get_port_address(env, obj))) {
    
case  SERIAL_PORT_PARITY_NONE:
        id 
=  ( * env) -> GetStaticFieldID(env, clrParity,  " None " " LSerialPort$Parity; " );
        
break ;
    
case  SERIAL_PORT_PARITY_ODD:
        id 
=  ( * env) -> GetStaticFieldID(env, clrParity,  " Odd " " LSerialPort$Parity; " );
        
break ;
    
case  SERIAL_PORT_PARITY_EVEN:
        id 
=  ( * env) -> GetStaticFieldID(env, clrParity,  " Even " " LSerialPort$Parity; " );
        
break ;
    
case  SERIAL_PORT_PARITY_MARK:
        id 
=  ( * env) -> GetStaticFieldID(env, clrParity,  " Mark " " LSerialPort$Parity; " );
        
break ;
    
case  SERIAL_PORT_PARITY_SPACE:
        id 
=  ( * env) -> GetStaticFieldID(env, clrParity,  " Space " " LSerialPort$Parity; " );
        
break ;
    }
    
return  ( * env) -> GetStaticObjectField(env, clrParity, id);
}

相关文章
|
7月前
|
Java API C++
Java JNI开发时常用数据类型与C++中数据类型转换
Java JNI开发时常用数据类型与C++中数据类型转换
277 0
|
8月前
|
安全 Java 程序员
Java语言枚举(Enum)的深入探索
Java语言枚举(Enum)的深入探索
108 0
|
4月前
|
安全 Java 开发者
Java 枚举(enum)详解
Java 中的枚举(`enum`)是一种特殊的数据类型,用于定义一组固定的常量,提升代码的类型安全性和可读性。枚举使用 `enum` 关键字定义,支持方法和构造函数,具有类型安全、单例、自动序列化等特点,并且可以遍历和用于 `switch` 语句中。实际应用包括状态机、指令集、类型标识等场景。枚举使代码更加清晰易维护。
340 1
|
4月前
|
安全 Java API
【性能与安全的双重飞跃】JDK 22外部函数与内存API:JNI的继任者,引领Java新潮流!
【9月更文挑战第7天】JDK 22外部函数与内存API的发布,标志着Java在性能与安全性方面实现了双重飞跃。作为JNI的继任者,这一新特性不仅简化了Java与本地代码的交互过程,还提升了程序的性能和安全性。我们有理由相信,在外部函数与内存API的引领下,Java将开启一个全新的编程时代,为开发者们带来更加高效、更加安全的编程体验。让我们共同期待Java在未来的辉煌成就!
95 11
|
4月前
|
安全 Java API
【本地与Java无缝对接】JDK 22外部函数和内存API:JNI终结者,性能与安全双提升!
【9月更文挑战第6天】JDK 22的外部函数和内存API无疑是Java编程语言发展史上的一个重要里程碑。它不仅解决了JNI的诸多局限和挑战,还为Java与本地代码的互操作提供了更加高效、安全和简洁的解决方案。随着FFM API的逐渐成熟和完善,我们有理由相信,Java将在更多领域展现出其强大的生命力和竞争力。让我们共同期待Java编程新纪元的到来!
143 11
|
6月前
|
Java
Java里的enum类型可以用这swich里吗
Java里的enum类型可以用这swich里吗
42 9
|
5月前
|
开发框架 Java Android开发
JNI中调用Java函数
JNI中调用Java函数
42 0
|
5月前
|
开发框架 Java Android开发
JNI中调用Java函数
JNI中调用Java函数
43 0
|
5月前
|
算法 Java Linux
Intellij Java JNI 调用 C++
Intellij Java JNI 调用 C++
46 0
|
8月前
|
Java 索引
Java 枚举(enum)
5月更文挑战第7天