今天调试了一下Android jni关于Java中调用C代码嘚程序发现我的java数组什么类型参数传递方式不对,导致值传递不正确我的方法是:
返回结果:,明显值没有传到C代码
2、问题所在及解决方法
查看了一些关于android jni参数传递方面的资料,发现问题出在C代码中的
我用这种方法的时候用ndk命令编译时出错了。
貌似ndk命令只支持这个方式吧我不太确定,还请高人指点
JNIjava数组什么类型传递与异常处理
JNI通过JNIEnv提供的操作Javajava数组什么类型的功能。它提供了两个函数:一个是操莋java的简单型java数组什么类型的另一个是操作对象类型java数组什么类型的。
因为速度的原因简单类型的java数组什么类型作为指向本地类型的指針暴露给本地代码。因此它们能作为常规的java数组什么类型存取。这个指针是指向实际的Javajava数组什么类型或者Javajava数组什么类型的拷贝的指针叧外,java数组什么类型的布置保证匹配本地类型
为了存取Java简单类型的java数组什么类型,你就要要使用GetXXXArrayElements函数(见表A)XXX代表了java数组什么类型的類型。这个函数把Javajava数组什么类型看成参数返回一个指向对应的本地类型的java数组什么类型的指针。
当你对java数组什么类型的存取完成后要確保调用相应的ReleaseXXXArrayElements函数,参数是对应Java数 组和GetXXXArrayElements返回的指针如果必要的话,这个释放函数会复制你做的任何变化(这样它们就反射到javajava数组什么類型)然后释放所 有相关的资源。
下面通过一个实际的例子,演示一下在JAVA中传递基本类型的java数组什么类型与对象类型的java数组什么类型然後在C++中进行相应的处理。
在这个简单的java程序中我们定义了两种类型的java数组什么类型,一种是整形java数组什么类型属于基本数据类型的java数組什么类型,另一种是字符串类型 的java数组什么类型属于对象java数组什么类型。然后把这两种类型java数组什么类型分别作为参数传递到本地方法sum中去其中sum函数具有相同的函数名和返回值类型,区别它们的是参数类 型这样,就涉及到方法签名的问题方法签名是参数的类型+方法的返回值类型。可知它们的方法签名是不相同的,所以为两个不同的方法
经过编译,生成C++的头文件这个过程可以参考
//返回一个jint类型的java数组什么类型
//复制java数组什么类型到新的java数组什么类型中
功能:构造一个java数组什么类型对象
返回值:返回一个jintArray类型。
由于在C++中,jintArray不能用下標直接存取,所以用到JNI中提供的接口函数进行操作
功能:返回对应索引值的object.返回的是一个java数组什么类型元素的值。
功能:用来设置对应索引元素的值
对于java数组什么类型的操作就介绍到这了。
下面看一个简单的例子:
在这个JAVA代码中,定义了一个整形java数组什么类型然后在callback()方法中调用這个java数组什么类型,可以看到java数组什么类型越界了下面演示在C++中如何捕获这个异常。
返回值:返回一个异常对象
功能:清除该异常对象,呮在本线程中传递
功能:抛出一个指定的异常对象和异常信息。
第一行是C++中打印的信息,第二行是从C++中抛出的异常
都注释掉,也会向JAVA中拋出异常这时就没有清除掉异常了。
总之,java数组什么类型的传递与异常在处理在JNI中非常的重要在这里只是简单的介绍一下,欢迎大家共哃学习