目前,我正在尝试创建一个使用CUDA功能的Java应用程序.CUDA和Java之间的连接工作正常,但我有另一个问题,想问一下,如果我的想法是正确的.
当我从Java调用本机函数时,我将一些数据传递给它,函数计算一些东西并返回结果.是否有可能让第一个函数返回一个引用(指针)到这个结果,我可以传递给JNI并调用另一个用结果进行进一步计算的函数?
我的想法是通过将数据保留在GPU内存中并只是传递对它的引用来减少从GPU复制数据所带来的开销,以便其他函数可以使用它.
经过一段时间的尝试,我想,这应该是不可能的,因为指针在应用程序结束后被删除(在这种情况下,当C函数终止时).它是否正确?或者我只是在C中看到解决方案?
编辑:嗯,稍微扩展问题(或使其更清楚):当函数结束时,JNI本机函数分配的内存是否已释放?或者我可以访问它,直到JNI应用程序结束或我手动释放它?
感谢您的输入 :)
我有一些C函数,我通过JNI调用它接受一个结构的指针,以及一些其他函数,它们将分配/释放一个指向同一类型结构的指针,这样它就更容易处理我的包装器.令人惊讶的是,JNI文档对如何处理C结构几乎没有说明.
我的C头文件看起来像这样:
typedef struct _MyStruct {
float member;
} MyStruct;
MyStruct* createNewMyStruct();
void processData(int *data, int numObjects, MyStruct *arguments);
Run Code Online (Sandbox Code Playgroud)
相应的JNI C包装文件包含:
JNIEXPORT jobject JNICALL
Java_com_myorg_MyJavaClass_createNewMyStruct(JNIEnv *env, jobject this) {
return createNewMyStruct();
}
JNIEXPORT void JNICALL
Java_com_myorg_MyJavaClass_processData(JNIEnv *env, jobject this, jintArray data,
jint numObjects, jobject arguments) {
int *actualData = (*env)->GetIntArrayElements(env, data, NULL);
processData(actualData, numObjects, arguments);
(*env)->ReleaseIntArrayElements(env, data, actualData, NULL);
}
Run Code Online (Sandbox Code Playgroud)
...最后,相应的Java类:
public class MyJavaClass {
static { System.loadLibrary("MyJniLibrary"); }
private native MyStruct createNewMyStruct();
private native void processData(int[] data, int numObjects, …Run Code Online (Sandbox Code Playgroud) 使用JNI我们可以将自定义数据类型从Java传递到C(反之亦然)吗?我看到原始数据类型到C中的类型的映射,但是我们不能确定是否可以发送我们自己的数据类型(例如发送或返回一个Employee对象或其他东西!).
我有一个C结构.
struct data{
double value1[50];
double value2[50];
int count;
};
Run Code Online (Sandbox Code Playgroud)
我想将数据从java映射到这个C结构.如何使用JNI?java代码不会由我编程.java程序员只想知道他应该以哪种形式向我发送数据?他应该期待更多细节吗?
我目前正在通过使用包含2列的CSV文件填充结构实例来测试我的代码.
我还想从我的C代码返回3个double值到java应用程序.
我正在尝试将结构作为指针从JNI传递到Java,以便稍后可以将其从Java传递回JNI.我已经读过这个帖子:通过JNI在C和Java之间传递指针,但是我没有成功.
我有一个非常复杂的结构: struct myStruct_s myStruct;
从Java,我称之为JNI函数初始化结构,并返回一个长(指针结构):
JNIEXPORT jlong JNICALL Java_example_ExampleJNI_getStruct(JNIEnv *jenv, jclass jcls) {
struct myStruct_s mystruct;
long *lp = (long*)&myStruct;
return lp;
}
Run Code Online (Sandbox Code Playgroud)
然后我用一个长的参数调用一个Java方法.在JNI中,我希望能够使用之前创建的strcuture.我喜欢这个:
JNIEEXPORT jint JNICALL Java_example_ExampleJNI_methode1(JNIEnv *jenv, jclass jcls, jlong jarg) {
struct myStruct_s *arg = (struct myStruct_s *)&jarg;
...
}
Run Code Online (Sandbox Code Playgroud)
好吧它不起作用.我想我对结构中的长镜头是错误的.我该怎么办?谢谢.
编辑:感谢您的提示,这里是工作函数
JNIEXPORT jint JNICALL Java_example_ExampleJNI_methode1(JNIEnv *jenv, jclass jcls, jlong jarg) {
struct myStruct_s *arg;
arg = (struct myStruct_s *)jarg;
...
}
JNIEXPORT jlong JNICALL Java_example_ExampleJNI_getStruct(JNIEnv *jenv, jclass jcls) {
struct myStruct_s *myStruct; …Run Code Online (Sandbox Code Playgroud)