.c 代码的 java 包装器

标签 java c java-native-interface swig

我有以下 C 代码:

测试.c

#include <stdio.h>
#include <math.h>

int add (int a, int b)
{
    a=4;
    b=4;
    return a+b;
}

int add_pointer (int *a, int *b)
{
    printf("values of a,b: %d,%d \n",*a,*b);
return ((*a)+(*b));
}

char* print_hello()
{
    return "hello_world";
}

测试.h

#ifndef TEST_H_
#define TEST_H_

int add(int a, int b);
int add_pointer (int *a, int *b);
char *print_hello();

#endif

主.c

#include "test.h"
#include <stdio.h>
#include <math.h>

int main()
{
    int a,b,c,d;
    char* rez;

    a=5;
    b=2;

    //int *r=&a;
    c= add(a,b);
    d=add_pointer(&a,&b);
    rez=print_hello();

    printf("sum is: %d and : %s %d \n",c,rez,d);
    return 0;
}

测试应用.i

%module test_app

%{
#include "test.h"
%}

%include "test.h"

我想为这个 .c 代码创建一个 java 包装器。我想稍后在 android 演示中使用这个包装器。

我做了以下事情:

$: swig -java test_app.i

给予:

test_app_wrapper.c
test_app.java
test_appJNI.java
SWIGTYPE_p_int.java 

$: gcc -fpic -c test.c test_app_wrap.c -I /usr/lib/jvm/java-7-openjdk-amd64/include -I /usr/lib/jvm/java-7-openjdk-amd64/include/linux
$: gcc -shared test.o test_app_wrap.o -o libtest_app_wrap.so

更新:

Hello World .java

      public class HelloWorld {
    native String print_hello(); /* (1) */
    static {
        System.loadLibrary("test_app_wrap"); /* (2) */
    }
    static public void main(String argv[]) {
        HelloWorld helloWorld = new HelloWorld();
        helloWorld.print_hello(); /* (3) */
    }
}

运行时:

$: javac HelloWorld.java 
$ java HelloWorld

我有:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no test_app_wrap in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1856)
    at java.lang.Runtime.loadLibrary0(Runtime.java:845)
    at java.lang.System.loadLibrary(System.java:1084)
    at HelloWorld.<clinit>(HelloWorld.java:4)

我做错了什么?

最佳答案

看来你不明白jni是如何工作的,看看这个教程:

Calling C code from Java using JNI

你的 test_app_wrap 不存在,要使用 JNI,你必须为你的 C 函数分配一个特定的名称,然后创建一个带有本地方法的 Java 类来调用它们,即

native String print_hello();

然后,在 Java 类中,加载 native 库。

然后您将创建一个 YourClass Java 对象并调用 print_hello() 本地方法

关于.c 代码的 java 包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15565947/

相关文章:

java - jtable 条目重复

java - 为什么 jmap 和 jcmd 生成的堆转储大小不同?

java - 哪个 GUI 生成器可用于 2D 游戏用户界面建模?

java - 输入流和输入流读取器

c - 是否可以通过 TCP 进行广播?

C 对齐列 w/printf() w/每列后恰好有 2 个空格

c - 无符号字符表长度

android - Hello-jni 示例在 Android Studio 2.0 预览版中不起作用

java - 在 native 信号处理期间从 JNI 进行 Java 调用

Android OpenCV 与 JNI 性能不佳