博主在实习中遇到了实际开发的问题,关于JNI,之前已经有一个博客和小的demo:
https://blog.csdn.net/Applying/article/details/81572167
现在的需求是:JAVA端获取到一定格式的数据,并传递给C++端,C++端获取这部分数据之后,进行算法的操作,将操作结果重新以另外特定的结构格式传递给JAVA端使用。
思路:其实我们现在要实现的,就是JAVA与C++之间交互特定的数据结构,这里常见碰到的有三种:
- String类
- JAVA类
- 类数组
接下来,分3个部分,简单写一下demo:
1. JAVA与C++之间传递String
JAVA端代码:
// Hello.java:
public class Hello {
static {
System.loadLibrary("HelloC");
}
public native Student testGetStudent();
public native void testPassStudent(Student student);
}
C++端代码:
// Impl.cpp:
JNIEXPORT jstring JNICALL Java_aa_bb_cc_Hello_testGetString
(JNIEnv * env, jobject)
{
// 1. 创建字符串
char * a = "hello java";
// 2. 直接转为jstring类型
jstring returnValue = env->NewStringUTF(a);
return returnValue;
}
JNIEXPORT void JNICALL Java_aa_bb_cc_Hello_testPassString
(JNIEnv * env, jobject, jstring string)
{
const char * a = env->GetStringUTFChars(string, NULL);
cout << a << endl;
return;
}
Junit测试代码及结果:
// testHello.java:
class HelloTest {
private Hello hello = new Hello();
@Test
void testGetString() {
System.loadLibrary("HelloC");
String temp = hello.testGetString();
System.out.println(temp);
}
@Test
void testPassString() {
System.loadLibrary("HelloC");
hello.testPassString("hello ");
}
}
2. JAVA与C++之间传递JAVA类
JAVA端代码:
// Hello.java:
public class Hello {
static {
System.loadLibrary("HelloC");
}
public native Student testGetStudent();
public native void testPassStudent(Student student);
}
// 这里定义了一个学生类,Student.java:
public class Student {
private int height;
private int weight;
private int[] grade;
public Student(int height, int weight, int[] grade) {
super();
this.height = height;
this.weight = weight;
this.grade = grade;
}
public Student() {
}
@Override
public String toString() {
return "Student [heig