有与项目组需要用到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 = ;
for (int i = ; i<count; i++)
{
for (int j = count - ; j >= i; j--)
{
if (p[j]>p[j - ])
{
temp = p[j];
p[j] = p[j - ];
p[j - ] = temp;
}
}
}
} int test(int *p, char* count){
int conversion = ;
count[ * conversion] = 'm';
count[ * conversion] = 'j';
count[ * conversion] = 'o';
count[ * conversion] = 'r';
count[ * conversion] = 'c';
count[ * conversion] = 'e';
count[ * conversion] = 'n';
printf("char size is d% " , sizeof('m'));
p[] = ;
p[] = ;
return ;
}
int sum(int i1, int i2){ return i1 + i2;
} void sort2(int **p, int count ,char* chars)
{
try{ int conversion = ;
printf("conversion is %d \n", conversion);
printf("**p is %d \n", sizeof(** p));
chars[ * conversion] = 'm';
chars[ * conversion] = 'j';
chars[ * conversion] = 'o'; chars[ * conversion] = 'r';
chars[ * conversion] = 'c';
chars[ * conversion] = 'e'; chars[ * conversion] = 'n'; int *temp ;
for (int i = ; i<count; i++)
{
printf("temp[0] is %d ,temp[1] is %d \n", p[i][], p[i][]);
for (int j = count - ; j >= i; j--)
{ if (p[j][]>p[j - ][])
{
temp = p[j]; p[j] = p[j - ];
p[j - ] = temp; }
}
}
}
catch (std::exception& e)
{
std::cerr << "exception caught: " << e.what() << '\n';
}
}

jna 使用实例,的更多相关文章

  1. JNA入门实例

    JNA(Java Native Access):建立在JNI之上的Java开源框架,SUN主导开发,用来调用C.C++代码,尤其是底层库文件(windows中叫dll文件,linux下是so[shar ...

  2. 最近学习工作流 推荐一个activiti 的教程文档

    全文地址:http://www.mossle.com/docs/activiti/ Activiti 5.15 用户手册 Table of Contents 1. 简介 协议 下载 源码 必要的软件 ...

  3. JNA的步骤、简单实例以及资料整理

    1.步骤 1.编写dll文件,放入项目的bin目录(在window上是dll文件,在Linux上是so文件,dll和so都是由C程序生成)  2.新建接口继承Library  3.加载对应的dll或者 ...

  4. [JNA系列]Java调用Delphi编写的Dll之实例Delphi使用PWideChar

    Delphi代码 unit UnitDll; interface uses StrUtils, SysUtils, Dialogs; function DoBusinessWide(pvData: P ...

  5. [JNA系列]Java调用Delphi编写的Dll之实例Delphi使用PAnsiChar

    Delphi代码 unit UnitDll; interface uses StrUtils, SysUtils, Dialogs; function DoBusinessAnsi(pvData: P ...

  6. java 用JNA方法调用C++动态链接库

    JNA(Java Native Access)框架是一个开源的Java框架,是SUN公司主导开发的,建立在经典的JNI的基础之上的一个框架.非常强大.易用,功能上类似与.NET的P/Invoke.你只 ...

  7. JNA—JNI终结者

    JNA—JNI终结者 介绍 给大家介绍一个最新的访问本机代码的Java框架—JNA. JNA(Java Native Access)框架是一个开源的Java框架,是SUN公司主导开发的,建立在经典的J ...

  8. JNI的替代者—使用JNA访问Java外部功能接口

    摘自:http://www.cnblogs.com/lanxuezaipiao/p/3635556.html JNI的替代者-使用JNA访问Java外部功能接口 1. JNA简单介绍 先说JNI(Ja ...

  9. java 利用jna调用c#的dll

    一.需求阐述: 如果我们的项目利用c#开发,到了开发后期需要和java组进行合作,其中有一部分业务逻辑利用c#已经code completed,那么我们可能会考虑用java来调用现成的c#dll实现需 ...

随机推荐

  1. 【排障】nginx在reload时候报错invalid PID number

    nginx在reload时候报错invalid PID number nginx重新加载配置文件时候报错,提示无效的PID: 解决的办法有二: 第一种思路是因为是加载配置文件报的错,所以用-c 选项指 ...

  2. 【C语言】01-函数

    一.函数的分类 前面已经说过,C语言中的函数就是面向对象中的"方法",C语言的函数可以大概分为3类: 1.主函数,也就是main函数.每个程序中只能有一个.也必须有一个主函数.无论 ...

  3. 兼容IE6/IE7/IE8/FireFox的css hack

    兼容IE6/IE7/IE8/FireFox的css hack .color{ background-color: #CC00FF; background-color: #FF00009; *backg ...

  4. PHP基础2

    一.函数赋值问题   function add($num1,$num2=5){ echo $num1+$num2; } add(5,19);   二.global 全局变量 把变量加入到全局变量数组中 ...

  5. Linux命令行程序和内建指令

    摘录百度分类 文件系统 cat cd chmod chown chgrp cksum cmp cp du df fsck fuser ln ls lsattr lsof mkdir mount mv ...

  6. SharePoint 学习记事(三)

    做一件事情,计划很重要,但是变化会将一切的付出付诸东流. 13年年底,领导想要调整资源,准备启动项目.于是我们召开了一个类似于启动会的资源筹备会.(处于低成本的考虑,部门领导想要共享日本组的两个做.n ...

  7. Operation not allowed for reason code "7" on table 原因码 "7"的解决

    对表进行任何操作都不被允许,提示SQLSTATE=57016 SQLCODE=-668 ,原因码 "7"的错误:SQL0668N Operation not allowed for ...

  8. dapper关联关系查询小测试

    测试实体类(表结构) public class User { public int user_id { get; set; } public string user_name { get; set; ...

  9. Java大数操作类

    Java的大数操作分为BigInteger和BigDecimal,但这两给类是分开使用的,有时候在编程的时候显得略微繁琐,现在编写了一个将二者合二为一的大数操作类. 大数操作类代码如下: packag ...

  10. 第8条:覆盖equals时遵守通用约定

    如果不需要覆盖equals方法,那么就无需担心覆盖equals方法导致的错误. 什么时候不需要覆盖equals方法? 1.类的每个实例本质上是唯一的. 例如对于Thread,Object提供的equa ...