JNI技术学习(二):Java 与 C++ 之间传递String,自定义类,自定义类的数组

本文详细介绍了如何使用JNI在Java和C++之间传递String、自定义类以及类数组。通过提供JAVA端、C++端的代码示例和Junit测试结果,展示了数据交互的过程。同时,博主分享了遇到的坑,如自定义类必须有无参构造函数,以及设置`java.library.path`为动态链接库路径的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

博主在实习中遇到了实际开发的问题,关于JNI,之前已经有一个博客和小的demo:
https://blog.youkuaiyun.com/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 [height=" + height 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值