JNI开发:Jni数据类型和构造方法父类的访问

2017-06-19  本文已影响0人  slds

JNI数据类型
基本数据
Java基本数据类型与JNI数据类型的映射关系

Java类型->JNI类型->C类型

JNI的基本数据类型有(左边是Java,右边是JNI):

boolean             jboolean
byte                 jbyte
char                 jchar
short                 jshort
int                 jint
long                 jlong
float                 jfloat
double                 jdouble
void                 void

引用类型(对象)

String                 jstring
Object                 jobject

数组,基本数据类型的数组
byte[]                jByteArray
对象数组
object[](String[])     

native函数参数说明

每个native函数,都至少有两个参数(JNIEnv*,jclass或者jobject)。
1)当native方法为静态方法时:
jclass 代表native方法所属类的class对象(JniTest.class)。
2)当native方法为非静态方法时:
jobject 代表native方法所属的对象。
native函数的头文件可以自己写。

关于属性与方法的签名

一、属性的签名
属性的签名其实就是属性的类型的简称,对应关系如下:

image.png

尤其注意的是,类的签名格式就是:

L完整包名;

其中完整包名用 / 代替.
末尾的 ; 不能省略
数组的签名就是:

[类型签名

其中,多为数组就用多个[

二、方法的签名
获取方法的签名比较麻烦一些,通过下面的方法也可以拿到属性的签名。
打开命令行,

javap -s -p 完整类名

我们通过as的terminal工具进入到F:\MyApplication\app\build\intermediates\classes\debug>,然后输入命令:

 javap -s -p com.example.gyf.GyfJniTest

public class com.example.gyf.GyfJniTest {
  public java.lang.String name;
    descriptor: Ljava/lang/String;
  public static int NUM;
    descriptor: I
  public com.example.gyf.GyfJniTest();
    descriptor: ()V

  public int getAdminName(int);
    descriptor: (I)I

  public static java.lang.String getUUID();
    descriptor: ()Ljava/lang/String;

  public native java.lang.String getNameFromC();
    descriptor: ()Ljava/lang/String;

  public native void getStaticNameFormC();
    descriptor: ()V

  public native int getMethodFromC();
    descriptor: ()I

  public native java.lang.String getStaticMethodFromC();
    descriptor: ()Ljava/lang/String;

  public native long accessConstructor();
    descriptor: ()J

  static {};
    descriptor: ()V
}

其中,descriptor就是我们需要的签名了,注意签名中末尾的分号不能省略。
方法签名的规律就是,括号不可以省略:

(参数类型签名)返回值类型签名

构造方法和父类的访问:
github地址:https://github.com/momoshusheng/baseJni

上一篇下一篇

猜你喜欢

热点阅读