如何在 JNI 中传递参数

Posted

技术标签:

【中文标题】如何在 JNI 中传递参数【英文标题】:How to pass out parameter in JNI 【发布时间】:2015-09-23 11:30:04 【问题描述】:

我有下面的 java 代码

public class JNIWrapper 

static




    System.loadLibrary("JNIDemo");


public native String get_error_string(int error_code);
public native int  start(Param_s params);
public native int cancel(String cookies);
public native int get_file_name(String cookies,String fileName);

public native int get_status(String cookies,int percentage_complete);

下面是我生成的 .H 文件

 /* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class demo_JNIWrapper */

#ifndef _Included_demo_JNIWrapper
#define _Included_demo_JNIWrapper
#ifdef __cplusplus
extern "C" 
#endif

JNIEXPORT jstring JNICALL Java_demo_JNIWrapper_get_1error_1string
  (JNIEnv *, jobject, jint);


JNIEXPORT jint JNICALL Java_demo_JNIWrapper_1start
  (JNIEnv *, jobject, jobject);


JNIEXPORT jint JNICALL Java_demo_JNIWrapper_cancel
  (JNIEnv *, jobject, jstring);


JNIEXPORT jint JNICALL Java_demo_JNIWrapper_getfile_1name
  (JNIEnv *, jobject, jstring, jstring);


JNIEXPORT jint JNICALL Java_demo_JNIWrapper_get_1status
  (JNIEnv *, jobject, jstring, jint);

#ifdef __cplusplus

#endif
#endif

如果让我们说 get_status,我希望将 percent_complete 作为 out 参数并返回 0,这样我将同时返回 percent_complete(因为它在 out 参数中)一个返回值。

任何帮助都将受到高度赞赏,并且会非常有帮助

注意:我不能为此使用结构,即:我不能将百分比完成和返回输出都封装在结构中并返回该结构)

【问题讨论】:

Java 中没有“out”参数,因此 JNI 本地方法中也没有。 【参考方案1】:

你必须返回两件事:

    错误指示。 一个整数值。

成功时返回Integer 对象,失败时返回null。改变

public native int get_status(String cookies,int percentage_complete);

public native Integer get_status(String cookies);

这将更改您生成的头文件,并且您必须对您的 C 代码进行相应的更改。

【讨论】:

但这只会返回一个整数,我想返回 a)error_indication b)out 参数是整数值(完成百分比) 如果您返回 null 而不是 Integer object,这将是您的错误指示。 不,我的完成百分比可以是 70%,错误指示为 0,也可以是 100%,error_indication 为 80%,也可以是 50%,error_indication 为 1 闻起来像Primitive Obsession。

以上是关于如何在 JNI 中传递参数的主要内容,如果未能解决你的问题,请参考以下文章

JNI程序如何进行参数传递

如何使用来自 Java 的指针传递 Void 参数以及如何为此编写 JNI?

如何修改从java传递给jni的int参数

将参数从 C/C++ JNI 传递到 Java 并获取修改后的值

从本机 c 代码 (JNI) 为 Java 中的回调函数传递多个参数

JNI内通过参数形式从C/C++中传递string类型数据至Java层