Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从JNI(Java本机接口)访问C常量(头)_Java_C_Header_Java Native Interface_Constants - Fatal编程技术网

从JNI(Java本机接口)访问C常量(头)

从JNI(Java本机接口)访问C常量(头),java,c,header,java-native-interface,constants,Java,C,Header,Java Native Interface,Constants,如何从Java端(通过JNI)访问C头文件中定义的常量 我有一个带有此头文件C_header.h的C库: // I'll try to get these values in java #define PBYTES 64 #define SBYTES 128 #define SGBYTES 128 #ifdef __cplusplus extern "C" { #endif /* * Class: libbind_libbind_jni * Method: pubm * S

如何从Java端(通过JNI)访问C头文件中定义的常量

我有一个带有此头文件C_header.h的C库:

// I'll try to get these values in java
#define PBYTES 64
#define SBYTES 128
#define SGBYTES 128
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     libbind_libbind_jni
 * Method:    pubm
 * Signature: (Ljava/lang/String;)[Ljava/lang/String;
 */
JNIEXPORT jobjectArray JNICALL Java_lib_f_1jni_pubm
  (JNIEnv *, jclass, jstring);
然后我有了这个java代码libbind_jni.java:

package libbind;

public class libbind_jni {
static{
    try {
        System.load("libbind_jni.so");
    } catch (UnsatisfiedLinkError e) {
        System.err.println("Native code library failed to load.\n" + e);
        System.exit(1);
    }
}

public static native String[] pubm(String seed);
然后在libbind_jni.java上运行javah,生成jni头文件jni_header.h:

// I'll try to get these values in java
#define PBYTES 64
#define SBYTES 128
#define SGBYTES 128
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     libbind_libbind_jni
 * Method:    pubm
 * Signature: (Ljava/lang/String;)[Ljava/lang/String;
 */
JNIEXPORT jobjectArray JNICALL Java_lib_f_1jni_pubm
  (JNIEnv *, jclass, jstring);
然后,我为JNI库JNI_source.C编写了一些C代码:

#include "jni_header.h"
#include "c_header.h"
#include <stdlib.h>

JNIEXPORT jobjectArray JNICALL Java_libbind_libbind_1jni_pubm
  (JNIEnv *env, jclass cls, jstring jniSeed){
    unsigned char vk[PBYTES];
    unsigned char sk[SBYTES];
    <whatever...>
}
所以问题是:如何从Java访问C头文件中的这些定义/常量


谢谢。

简单的答案是你不能。您必须在Java中定义相同的值

public static final int PBYTES = 64;
public static final int SBYTES = 128;
public static final int SGBYTES = 128;
或者您可以定义一些返回这些值的本机方法。但是宏本身不能从Java访问

public static native int PBYTES();
public static native int SBYTES();
public static native int SGBYTES();

另一种方法是什么?——从C++访问java常量?有没有办法避免在C++代码中定义相同的值?@ BiggvsDCVS是的,这是可以做到的,因为java常量只是普通类成员。不过,你需要做一些繁重的JNI编码,我还没有真正做过任何JNI编码(但有相当多的纯Java编码)。如果你能给我指出正确的方向,我将非常感激。我正在尝试为几个摄像头驱动程序编写Java包装。C++ API有一组不同参数(例如,曝光和快门模式等)的SETTER方法,我认为,使用一个键值对的单个设置器可能会减少工作量,但是键和一些值应该定义为常量。这是否真的是更少的工作?值得指出的是,它们实际上不能被C++代码访问,因为它们在运行时不再存在。宏只是编写可重用代码的一种方式,它们在编译的“预处理”阶段被内联。如果宏是动态的(如版本信息等),那么可以在JNI_OnLoad方法中设置java常量。