我正在使用JNA调用C库并获取" java.lang.Error:无效的内存访问",当我调用本机函数

时间:2017-06-14 16:53:42

标签: java c jna

我使用JNAerator生成了接口代码。 JAVA接口是从c头文件生成的。结果不一致。有时JVM崩溃,有时库未加载。但是,代码在调用本机函数时始终返回异常。当我在我的本机代码中添加一些调试备注时,我没有得到任何输出。看起来JNA代码根本不会调用本机方法

package org.libjpegturbo.turbojpeg;

import java.net.URL;
import java.util.Enumeration;
import com.sun.jna.Native;

import org.libjpegturbo.turbojpeg.JPEGLib;
import org.libjpegturbo.turbojpeg.JPEGLib.jpeg_decompress_struct;
import org.libjpegturbo.turbojpeg.JPEGLib.jpeg_error_mgr;

public class JPEG {

    static JPEGLib lib = null; 
    static jpeg_decompress_struct cinfo = null;

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        try {
            System.setProperty("jna.library.path", "C:/image_test/mozjpeg-master/.libs");
            lib =   JPEGLib.INSTANCE;
            System.out.println(lib.DCTSIZE2);
            jpeg_error_mgr err = new jpeg_error_mgr();
            System.out.println(1);
            cinfo = new jpeg_decompress_struct();
            System.out.println(2);
            cinfo.err = lib.jpeg_std_error(err);
            System.out.println(3);
            lib.jpeg_destroy_decompress(cinfo);
            System.out.println(4);

            lib.jpeg_CreateDecompress(cinfo, JPEGLib.JPEG_LIB_VERSION, null);
            lib.jpeg_create_decompress(cinfo);
            System.out.println(5);
            System.out.println(err.trace_level);
            System.out.println(2);
            System.gc();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            e.printStackTrace();
        }catch(Throwable e){
            System.out.println("2");
            System.out.println(e);
            e.printStackTrace();
        }



    }

    public void finalize() {
        System.out.println("A garbage collected");
    }

}

当我运行程序后,生成错误桩跟踪

java.lang.Error: Invalid memory access
    at com.sun.jna.Native.invokeVoid(Native Method)
    at com.sun.jna.Function.invoke(Function.java:408)
    at com.sun.jna.Function.invoke(Function.java:354)
    at com.sun.jna.Library$Handler.invoke(Library.java:244)
    at com.sun.proxy.$Proxy0.jpeg_destroy_decompress(Unknown Source)
    at org.libjpegturbo.turbojpeg.JPEG.main(JPEG.java:32)

当我在调用c库函数时传递简单类型时没有问题。但是,当我使用JNerator生成的类调用库函数时,库函数会返回错误

0 个答案:

没有答案