Linux安全网 - Linux操作系统_Linux 命令_Linux教程_Linux黑客

会员投稿 投稿指南 本期推荐:
搜索:
您的位置: Linux安全网 > Linux编程 > » 正文

Step By Step(Java 本地方法篇)(11)

来源: 未知 分享至:

27 jmethodID id_FileOutputStream = env->GetMethodID(class_FileOutputStream,\"<init>\"
28 ,\"(Ljava/lang/String;)V\");
29 jobject obj_Stream = env->NewObject(class_FileOutputStream,id_FileOutputStream,str_filename);
30 printf(\"Overn\");
31 }

    基于本例中实例化的对象,如果打算写出数据到文件,则需要继续获取write方法的jmethod ID,之后还要获取close方法的jmethod ID,因此在使用时还是比较麻烦的。
    11.    访问数组元素:
    先给出Java数组类型和C数组类型之间的对应关系:
    Java数组类型            C数组类型(JNI)
    boolean[]                 jbooleanArray
    byte[]                     jbyteArray
    char[]                     jcharArray
    int[]                        jintArray
    short[]                    jshortArray
    long[]                     jlongArray
    float[]                     jfloatArray
    double[]                  jdoubleArray
    Object[]                  jobjectArray
    JNI提供了以下几个C接口函数用于访问和操作Java中的数组数据:
    GetArrayLength()获取数组的长度;
    GetObjectArrayElement()和SetObjectArrayElement访问和设置对象数组中的元素,这样的访问方式,如果需要进行矩阵运算的高密度计算工作时,效率会比较低下,因此JNI中提供了另外一组接口方法用于直接获取数组的首地址,就像在C语言代码中操作数组一样,但是该组方法只能应用于原始数据类型,如int,short,float等。
    GetXxxArrayElements和ReleaseXxxArrayElements,这里的Xxx表示不同的原始数据类型。需要注意的是,所有对数组数据的修改只有在调用ReleaseXxxArrayElements方法后才能保证所作的改变在原始Java数组中得到反映。如下例中的部分C接口(JNI)代码:
    1)    包含native方法的Java类代码:

1     public class UpdateArray {
2 public static native void update(double[] d);
3 static {
4 System.loadLibrary(\"UpdateArray\");
5 }
6 }

    2)    实现本地方法的C语言代码:

 1     #include \"UpdateArray.h\"
2 JNIEXPORT void JNICALL Java_UpdateArray_update
3 (JNIEnv* env, jclass cl, jdoubleArray da)
4 {
5 double sacleFactor = 2.0;
6 double* a = env->GetDoubleArrayElements(da,NULL);
7 int length = env->GetArrayLength(da);
8 for (int i = 0; i < length; ++i) {
9 a[i] = a[i] * sacleFactor;
10 }
11 env->ReleaseDoubleArrayElements(da,a,0);
12 }

    3)    含有main函数的调用测试代码:

 1     public class MyTest {
2 public static void main(String[] args) throws Exception {
3 double[] dd = new double[10];

Tags:
分享至:
最新图文资讯
1 2 3 4 5 6
验证码:点击我更换图片 理智评论文明上网,拒绝恶意谩骂 用户名:
关于我们 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 发展历史