1N5

1.Java访问Native的步骤
* 在Java类中声明一个本地native方法。
* 使用Javah命令生成包含native方法定义的C/C++头文件。
* 按照生成的C/C++头文件来写C/C++源文件。
* 将C/C++源文件编译成动态链接库。
* 把DLL文件加入到PATH环境变量下。
* Java类中加载DLL,然后调用声明的native方法。
System.loadLibrary("nativeCode"); //如果找不到的话会抛出运行时异常。
(注:JNI会影响JavaApplication的跨平台特性。
Java是强类型的语言而C/C++不是,所以容易出错。)

2. JNIEnv类型实际上代表了Java环境。通过这个JNIEnv*指针,就可以对Java端的
代码进行操作。例如,创建Java类的对象,调用Java对象的方法,获取Java对象的
属性等等。JNIEnv的指针会被JNI传入到本地方法的实现函数中来对Java端的代码进
行操作。
NewObject/NewString/New<TYPE>Array
Get/Set<TYPE>Field
Get/SetStatic<TYPE>Field
Call<TYPE>Method/CallStatic<TYPE>Method

3.Java类型映射
int long jint/jsize I
long _int64 jlong L
byte signed char jbyte B
boolean unsigned char jboolean Z
char unsigned short jchar C
short short jshort S
float float jfloat F
double double jdouble D
object _jobject* jobject Ljava/lang/String;
Array [Ljava/lang/object;

4.JNIEnv类中有如下几个简单的函数可以取得jclass
jclass FindClass(const char* clsName);
jclass GetObjectClass(jobject obj);
jclass GetSuperClass(jclass obj);
(注:FindClass会在classpath系统环境变量下寻找类。
jclass cls_string = env->FindClass("java/lang/String");)

5.在C/C++本地代码中访问Java端的代码,一个常见的应用就是获取类的属性和调用类的方法。为了在C/C++中表示属性

和方法,JNI在Jni.h头文件中定义了jfieldID,jmethodID
类型来分别代表Java端的属性和方法。
GetFieldID/GetMethodID
GetStaticFieldID/GetStaticMethodID

6.引用Java层代码
* jclass clazz_TestNative = env->FindClass("cn/itcast/TestNative");
jmethodID id_func = env ->GetMethodID(clazz_TestNative,"toString","(I)V");
(注:最后一个参数是根据参数类型区分被重载的函数)
------------------------
* jclass hello_clazz = env->GetObjectClass(obj);
jfieldID fieldID_prop= env->GetFieldID(hello_clazz,"property","I");
jmethodID methodID_func = env->GetMethodID(hello_clazz,"function","(ILjava/util/Date;[I)I");
env->CallIntMethod(obj,methodID_func,OL,NULL,NULL);
------------------------
* jclass clazz_TestNative = env->GetObjectClass(obj);
jfieldID id_number = env_GetFieldID(clazz_TestNative,"number","I");
jint number = env->GetIntField(obj,id_number);
env->SetIntField(obj,id_number,100L);
------------------------
boolean function(int i,double d,char c){...}
* env->CallBooleanMethod(obj,id_function,100L,3.44,L'3');
* jvalue *args = new jvlaue[3];
args[0].i = 100L;
args[1].d = 3.44;
args[3].c = L'3';

7.在JNI中定义的CallNonvirtual<TYPE>Method就能够实现子类对象调用父类方法的功能。
如果想调用一个对象的父类的方法,而不是子类的这个方法的话,就可以使用CallNonvirtual<TYPE>Method。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
H4sIAAAAAAAAAO1YS2/bRhD+Kwblo0XzsXxIN8F2GgN2asR2e6gLYkUuzY1ILrFcSlACA+qhaHtpDi0KFOm1l556aIuiyJ/RwS76LzrLhy3ZUmwjbZAY0kXk7Mzuzsz3fUvysxeKJzj2Bx4NlK6pIYR0yzA3FEETonR120WuYbqWriEDjOMMjEoZoGwoAc0FTX1RxioGwmZomMh3+m4Qaj444JSl44QV+VKPmPaV7gtlHf69hIiIST+fBQTG1stBpZcGnEF8ZfCGhOeUpTBgqYZqSTPOshkzUpHqNt4BEZjG5ZyJmpM0ZzwPsMAqTnE8FtTP4aqcX82Dgdrr5zI5cVh5boNn72C31Soz3hmSVOymgnCIbbUW+6rP8BC3WjqyLeVsQyEyBpZPMuFV1xtKxllGuKAkL1PPfU5I6kWEnkbg6uoa7J3ld848xbJTyv7BETqWtoAMqU+WVnw9gerKiuwX+4W873OogFztyfbTj3e3lXL1mcVsVVP1N5RZIuU5S4nHwjAnkEEbuTKFBKdFCPUpOOHg/2TnaKd3uCMj6oxHNBARYAwhbVGz5XJlEkmiyu5BCYc4l/WLsQgZT7wajlt7B2u9LIMRmnsxO6WwPcELAuiSN14Wyd2lRQK+HauDNMvQHMftVK0IPJrmFYR1XXeR3rFsG+mwgRENaTPTekrEiPFBs+anu492lXqBrZhWTe6BxceCnDI+htvHLJEwjnG/rPehwIA3yQpfVCU8wv21PuYnm9PJZDr5Yzr5cjr5cTr5azr5czp5NZ18D9eyEpCWH+E0JbHn4zjuS7rWwApxnMvtNeNN89OQwQJ6A50b1IIpQ8oh7wCP61kArV4YF3nkzXPftizTPduYEwrXtl3HdszOTaHQTe2dCQUuBDuq1/jP1YKOIhwTP2ZFILGHCrWgagQ9VfcxTXvQxCEV41b5m6X6OmARIFFuakX1B0P1dRKTBDpcbZQDFRkcBaWgXw41pq5yC6ObgHqJ5giCMp0SoT4lkDYdkj08ZoWYKWPd/7ujs2qaiOdQs5xCb6kKhmbbhmlDvW/KgmmhBywLMJCwVN0q/94sDZ9QMjos27nShwelD5yEhFcJ3o+gBb8/tu4hCkvj/2dhoAGAnl5iu74dg0iyAa1BqbsucizT7ziahdtax7YC2w1DbOu4bSHHtfp6v420TsfQ2le+vm4akla36seMOoDDs3zp49A8p3TVMFRzGc7PbtB2GewX0nkh4ocgChnj4spXvoNdmWvvatrr2SzaOPCCQLtAacOQ+l7OCg5CUCP271e/XXz788XvX/zz1csZ55xg7kfegIwB3rI6Fz/9cv7yh/Ovfz2fvPbqoG++O389mQmaQf01ElxBOxIi655snmwCJv04k9CsaJx0Xc3WTjZbJ5tx4Q+2OR59REOxB32to70My8SVk81riF1Da8dLkDlrrbBZE7fZnBexXNQ7vK6u74OMLpfLpUJ4F4V6J2J5dpdT+9pzwOXxmOFTIjGv3Hh+MFEHoD/zrNG2QC1MzZWvIF407nMaeJHVJLBSpiq1igRDmtOGCoqhGWZbs9qGuaajrul0TVO1DEPOWXlfo3Bl7HM2yoE5MU5PC+gSDD6P2n560wPeRHkpgsrx0aO2e+VwNy2qfO8hRfcBHFQnpDGB6YXHUp8swJll2HM4s1wdUONYK5Stzr8P9vxrzKsD8MM9AC1zXph0G5TGMZFjr6RpJU23S9McmGehvERC3k66FijVSmjeH6GRH6EeU3GAi8EiqUHOnNSAypjys55xL6XpnH3+L4jsCGheHAAA对这个字符串进行解码时,使用了URLDecoder.decode,然后使用了Base64.getDecoder().decode()方法,出现Caused by: java.lang.IllegalArgumentException: Illegal base64 character 20
最新发布
06-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值