I have the following c code:
test.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";
}
test.h
#ifndef TEST_H_
#define TEST_H_
int add(int a, int b);
int add_pointer (int *a, int *b);
char *print_hello();
#endif
main.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;
}
test_app.i
%module test_app
%{
#include "test.h"
%}
%include "test.h"
我希望创建一个Java包装器,用于这个 .c 代码。稍后我想在 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
UPDATE:
HelloWorld.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)
我做错了什么?
swig
也生成了test_app.java
(是的,我已经尝试编译您的模块)。 - Code Painters