zoukankan      html  css  js  c++  java
  • jna 使用实例,

      有与项目组需要用到C++的一个模块, 需要将一个2维数组传到dll 里面 ,返回一个字符串, 恶心了1天终于完成了, 记录一下,同时也希望能给你带来帮助.

    java 代码如下,

    package test;
    
    import java.util.Arrays;
    
    import com.sun.jna.Library;
    import com.sun.jna.Memory;
    import com.sun.jna.Native;
    import com.sun.jna.Pointer;
    import com.sun.jna.ptr.PointerByReference;
    
    /**
     * 
     * 
     * @author mjorcen
     * @email mjorcen@gmail.com
     * @dateTime Aug 25, 2014 5:04:25 PM
     * @version 1
     */
    public class Project1Service {
    
        public interface Project1 extends Library {
            /**
             * 当前路径是在项目下,而不是bin输出目录下。
             */
            Project1 INSTANCE = (Project1) Native.loadLibrary("Project1",
                    Project1.class);
    
            public Integer sum(Integer i1, Integer i2);
    
            public Integer test(int[] is, char[] cs);
    
            public Integer sort(int[] is, Integer count);
    
            public Integer sort2(Pointer[] is, int count, char[] cs);
    
        }
    
        /**
              *
              */
        public Project1Service() {
            // TODO Auto-generated constructor stub
        }
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            try {
    
                sort2();
            } catch (Throwable e) {
                e.printStackTrace();
            }
            // TODO Auto-generated method stub
    
            // sum_fun();
            // sort();
            // test();
        }
    
        /**
         * 
         * 
         * @author mjorcen
         * @email mjorcen@gmail.com
         * @dateTime Aug 25, 2014 9:26:54 PM
         * @version 1
         */
        private static void sort2() {
    
            char[] cs = { '0', '0', '0', '0', '0', '0', '0', '0', '0' };
            Pointer[] byReferences = new Pointer[10];
            for (int i = 0; i < 10; i++) {
                PointerByReference byReference = new PointerByReference();
                Memory mymem = new Memory(4 * 2);
                // mymem.read(0, new int[] { 1, 2 }, 0, 2);
                mymem.setInt(4, 20);
                mymem.setInt(0, 10);
                byReference.setPointer(mymem);
                byReferences[i] = byReference.getPointer();
            }
            Project1.INSTANCE.sort2(byReferences, 10, cs);
            System.out.println(Arrays.toString(cs));
    
        }
    
        /**
         * 
         * 
         * @author mjorcen
         * @email mjorcen@gmail.com
         * @dateTime Aug 25, 2014 9:26:54 PM
         * @version 1
         */
        private static void sort2_2() {
            int[][] is = { { 12, 12 }, { 12, 12 }, { 12, 12 }, { 12, 12 },
                    { 12, 12 }, { 12, 12 }, { 12, 12 }, { 12, 12 }, { 12, 12 },
                    { 12, 12 } };
            char[] cs = { '0', '0', '0', '0', '0', '0', '0', '0', '0' };
    
            PointerByReference byReference = new PointerByReference();
            Memory mymem = new Memory(4 * 2 * 10);
            for (int i = 0; i < 10; i++) {
                mymem.read(i, new int[] { 1, 2 }, 0, 2);
            }
            byReference.setPointer(mymem);
            // Project1.INSTANCE.sort2(byReference.getPointer(), 10, cs);
            System.out.println(Arrays.toString(cs));
    
        }
    
        /**
         * 
         * 
         * @author mjorcen
         * @email mjorcen@gmail.com
         * @dateTime Aug 25, 2014 7:43:45 PM
         * @version 1
         */
        private static void test() {
            int[] is = { 12, 30, 39, 4, 5, 6, 10, 7, 8, 9 };
            char[] cs = { '0', '0', '0', '0', '0', '0', '0', '0', '0' };
            System.out.println(is);
            String str = "str";
            Integer count = Project1.INSTANCE.test(is, cs);
            System.out.println(Arrays.toString(is));
            System.out.println(Arrays.toString(cs));
            System.out.println("str =" + str);
            System.out.println(is.length);
        }
    
        /**
         * 
         * 
         * @author mjorcen
         * @email mjorcen@gmail.com
         * @dateTime Aug 25, 2014 6:44:21 PM
         * @version 1
         */
        private static void sort() {
            int[] is = { 1, 2, 3, 4, 5, 6, 10, 7, 8, 9 };
            System.out.println(Arrays.toString(is));
            Integer count = Project1.INSTANCE.sort(is, is.length);
            System.out.println(is.length);
    
        }
    
        private static void sum_fun() {
            Integer count = Project1.INSTANCE.sum(1, 2);
            System.out.println("count = " + count);
        }
    
    }

    ddl 代码如下

    h>

    #pragma once
    extern "C"_declspec(dllexport) void sort(int *p, int count);
    extern "C"_declspec(dllexport) int test(int *p, char* count);
    extern "C"_declspec(dllexport) int sum(int  i1,  int  i2);
    extern "C"_declspec(dllexport) void sort2(int **p, int count, char* chars);
    #include <stdio.h>
    #include <exception>      // std::exception
    #include <iostream>       // std::cerr
    class j_test
    {
    
    public:
        j_test();
        ~j_test();
        void sort(int *p, int count);
        void sort2(int **p, int count, char* chars);
        int sum(int  i1, int  i2);
        int test(int *p, char* count);
    };

    cpp>

    #include "j_test.h"
    
    
    j_test::j_test()
    {
    }
    
    
    j_test::~j_test()
    {
    }
    
     
    void sort(int *p, int count)
    { 
        int temp = 0;
        for (int i = 1; i<count; i++)
        {
            for (int j = count - 1; j >= i; j--)
            {
                if (p[j]>p[j - 1])
                {
                    temp = p[j];
                    p[j] = p[j - 1];
                    p[j - 1] = temp;
                }
            }
        }
    }
    
    int test(int *p, char* count){
        int conversion = 2;
        count[0 * conversion] = 'm';
        count[1 * conversion] = 'j';
        count[2 * conversion] = 'o';
        count[3 * conversion] = 'r';
        count[4 * conversion] = 'c';
        count[5 * conversion] = 'e';
        count[6 * conversion] = 'n';
        printf("char size is d% " , sizeof('m'));
        p[0] = 0;
        p[1] = 1;
        return 0;
    }
    int sum(int  i1, int  i2){
    
        return i1 + i2;
    }
    
    void sort2(int **p, int count ,char* chars)
    {
        try{
    
        
        int conversion = 2;
        printf("conversion is %d 
    ", conversion);
        printf("**p is %d 
    ", sizeof(** p));
        chars[0 * conversion] = 'm';
        chars[1 * conversion] = 'j';
        chars[2 * conversion] = 'o';
    
        chars[3 * conversion] = 'r';
        chars[4 * conversion] = 'c';
        chars[5 * conversion] = 'e';
    
        chars[6 * conversion] = 'n';
         
        int *temp  ;
        for (int i = 1; i<count; i++)
        {
            printf("temp[0] is %d ,temp[1] is %d 
    ", p[i][0], p[i][1]);
            for (int j = count - 1; j >= i; j--)
            {
                
                if (p[j][0]>p[j - 1][0])
                {
                    temp = p[j];
                    
                    p[j] = p[j - 1];
                    p[j - 1] = temp;
                    
                }
            }
        }
        }
        catch (std::exception& e)
        {
            std::cerr << "exception caught: " << e.what() << '
    ';
        }
    }
  • 相关阅读:
    [WPF系列]基础学习(一) WPF是什么?
    [WPF系列]从基础起步学习系列计划
    [WPF系列]Adorner应用-自定义控件ImageHotSpot
    Windows Phone 8 开发必备资源
    WPF:数据和行为
    WPF触发器(Trigger)
    【WPF】Silverlight中的Action与Trigger
    【WPF】 Behavior
    Struts2 拦截器配置及使用
    在新建FileInputStream时使用当前相对路径或者绝对路径作为参数的问题
  • 原文地址:https://www.cnblogs.com/mjorcen/p/3937546.html
Copyright © 2011-2022 走看看