这几天用jni封装了一个C++库文件,供java调用,在此把具体的步骤给理一下,方便自己温故,也供大家参考。
前提:已有一个动态库文件libTest.so和包含函数声明的头文件test.h。
1. 创建java项目:JProj
在头文件test.h中包含了类类型和接口函数。如头文件test.h:
#ifndef TEST_H
#define TEST_H
typedef struct _ST_1
{
int *a;
long b;
char c;
}ST1;
typedef struct _ST_2
{
int a[];
ST1 b;
}ST2;
typedef struct _ST_3
{
ST1 a[];
ST2 b;
int *c;
string d;
}ST3;
void *func1(int a,ST1 b);
void func2(void *a,ST2 &b);
int func3(int *a,ST3 *b);
#endif // TEST_H
为了能在java程序中调用相关的接口,我们也需要在java中创建相应的类类型和接口函数(可在一个文件或不同文件,在此为一个文件)。
在java项目中,添加一个包:com,在包下创建两个类:JDefine.java,JTest.java,其中JDefine.java用来类类型和接口函数。JDefine.java应写为:
public class JDefine
{
class clazz1
{
int[] a; //对应于C++中的int *a;
long b;
byte c; //对应于C++中的char c;
};
class clazz2
{
int[] a;
clazz1 b;
};
class clazz3
{
clazz1[] a;
clazz2 b;
int[] c;
string d;
};
public native long func1(int a,clazz1 b);
public native void func2(long a,clazz2 b);
public native int func3(int[] a,clazz3 b);
};
- 注意一:java程序想要通过jni调用C++的库,必须在函数声明时使用关键字native