使用JNA将const char **映射到Java类型 [英] Mapping const char** to Java type with JNA

查看:549
本文介绍了使用JNA将const char **映射到Java类型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用Java中的C ++库和JNA。在库的头文件中,我有以下方法声明:

I am trying to use a C++ library in Java with JNA. In the header file of the library I have the following method declaration:

extern "C" void foo(const char** bar);

参数 bar 应传递给 foo 为空, foo 为它指定一个我想在Java中检索的值。应该如何设置相应的Java方法声明(例如,我应该将 bar 映射到哪种Java类型),以及如何使用它?

The paramterer bar should be passed to foo empty, and foo vill assign it a value that I want to retreive in Java. How should the corresponding Java method declaration be set up (e.g. what Java type should I map bar to), and how can I use it?

我尝试了以下Java声明:

I have tried the following Java declarations:

void foo(String bar);
void foo(String[] bar);
void foo(Pointer bar);

当我调用 foo


线程main中的异常java.lang.Error:内存访问无效

Exception in thread "main" java.lang.Error: Invalid memory access


推荐答案

在下面找到一个小片段。

Find below a small snippet.

libfoo。 cpp

#include <stdio.h>
extern "C" void foo(const char** bar);

void foo(const char** bar) {
    for (int i = 0; bar[i] != '\0'; i++) {
        fprintf(stdout, "%s\n", bar[i]);
    }
}

LibFooDemo.java

import com.sun.jna.Library;
import com.sun.jna.Native;

public class LibFooDemo {

    public interface FooLibrary extends Library {
        FooLibrary INSTANCE = (FooLibrary)
                Native.loadLibrary("foo", FooLibrary.class);
        void foo(String[] format);
    }

    public static void main(String[] args) {
        String[] vals = {"foo", "bar", "foobar"};
        FooLibrary.INSTANCE.foo(vals);
    }
}

编译所有来源

gcc -c -fPIC libfoo.cpp -o libfoo.o
gcc -shared -o libfoo.so  libfoo.o
javac -cp jna-4.2.1.jar LibFooDemo.java

运行Java程序

java -Djava.library.path=. -cp jna-4.2.1.jar:. LibFooDemo

输出

foo
bar
foobar

这篇关于使用JNA将const char **映射到Java类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆