// src/lib.rs
use std::os::raw::c_int;
use std::slice;
#[repr(C)]
#[derive(Debug)]
pub struct Student {
pub num: c_int,
pub total: c_int,
}
#[no_mangle]
pub extern "C" fn fill_students(p_stu: *mut Student, n: c_int) {
assert!(!p_stu.is_null());
let s: &mut [Student] = unsafe { slice::from_raw_parts_mut(p_stu, n as usize) };
for elem in s.iter_mut() {
// fill any valid values
elem.num = 1 as c_int;
elem.total = 100 as c_int;
}
}
#[no_mangle]
pub extern "C" fn print_students(p_stu: *mut Student, n: c_int) {
assert!(!p_stu.is_null());
let s: &[Student] = unsafe { slice::from_raw_parts(p_stu, n as usize) };
for elem in s.iter() {
println!("print in rust side: {:?}", elem);
}
}
[lib]
crate-type = ["cdylib"]
// csrc/cfoo1.c
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct Students {
int num; // serial number
int total; // total score
} Student;
extern void fill_students(Student *stu, int);
extern void print_students(Student *stu, int);
void print_students_c(Student *stu, int n) {
int i;
for (i=0; i<n; i++) {
printf("C side print: %d %d\n", stu[i].num, stu[i].total);
}
}
void main() {
int len = 10;
Student students[len];
// call rust fill and print functions
fill_students(students, len);
print_students(students, len);
// call c print function
print_students_c(students, len);
}
gcc -o ./cfoo1 ./cfoo1.c -L ./ -lrustffi4
LD_LIBRARY_PATH=. ./cfoo1
print in rust side: Student { num: 1, total: 100 }
print in rust side: Student { num: 1, total: 100 }
print in rust side: Student { num: 1, total: 100 }
print in rust side: Student { num: 1, total: 100 }
print in rust side: Student { num: 1, total: 100 }
print in rust side: Student { num: 1, total: 100 }
print in rust side: Student { num: 1, total: 100 }
print in rust side: Student { num: 1, total: 100 }
print in rust side: Student { num: 1, total: 100 }
print in rust side: Student { num: 1, total: 100 }
C side print: 1 100
C side print: 1 100
C side print: 1 100
C side print: 1 100
C side print: 1 100
C side print: 1 100
C side print: 1 100
C side print: 1 100
C side print: 1 100
C side print: 1 100
// csrc/cfoo2.c
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct Students {
int num; // serial number
int total; // total score
} Student;
extern void fill_students(Student *stu, int);
extern void print_students(Student *stu, int);
Student* create_students(int n) {
if (n <= 0) return NULL;
Student *stu = NULL;
stu = (Student*) malloc(sizeof(Student)*n);
return stu;
}
void release_students(Student *stu) {
if (stu != NULL)
free(stu);
}
void print_students_c(Student *stu, int n) {
int i;
for (i=0; i<n; i++) {
printf("C side print: %d %d\n", stu[i].num, stu[i].total);
}
}
void main() {
int len = 10;
Student* students = create_students(len);
// call rust fill and print functions
fill_students(students, len);
print_students(students, len);
// call c print function
print_students_c(students, len);
release_students(students);
}
gcc -o ./cfoo2 ./cfoo2.c -L ./ -lrustffi4
LD_LIBRARY_PATH=. ./cfoo2
print in rust side: Student { num: 1, total: 100 }
print in rust side: Student { num: 1, total: 100 }
print in rust side: Student { num: 1, total: 100 }
print in rust side: Student { num: 1, total: 100 }
print in rust side: Student { num: 1, total: 100 }
print in rust side: Student { num: 1, total: 100 }
print in rust side: Student { num: 1, total: 100 }
print in rust side: Student { num: 1, total: 100 }
print in rust side: Student { num: 1, total: 100 }
print in rust side: Student { num: 1, total: 100 }
C side print: 1 100
C side print: 1 100
C side print: 1 100
C side print: 1 100
C side print: 1 100
C side print: 1 100
C side print: 1 100
C side print: 1 100
C side print: 1 100
C side print: 1 100
原文作者:Rust语言中文社区;如有侵权,请联系管理员删除。