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() << '
';
    }
}
原文地址:https://www.cnblogs.com/mjorcen/p/3937546.html