如何使用 javac 创建具有稳定名称的 h 文件

问题描述 投票:0回答:1

我有一个以

开头的Java类
package examples.logging;

public class FastLogging {

    // Logging class

    public static native long logging_new(int level, String domain, boolean console, String file, String server,
            String connect, int max_size, int backlog);

    public static native void logging_set_level(long instance_ptr, int level);
...

当我运行

javac -h . examples/logging/FastLogging.java
时,我得到以下输出:

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

#ifndef _Included_examples_logging_FastLogging
#define _Included_examples_logging_FastLogging
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     examples_logging_FastLogging
 * Method:    logging_new
 * Signature: (ILjava/lang/String;ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;II)J
 */
JNIEXPORT jlong JNICALL Java_examples_logging_FastLogging_logging_1new
  (JNIEnv *, jclass, jint, jstring, jboolean, jstring, jstring, jstring, jint, jint);

/*
 * Class:     examples_logging_FastLogging
 * Method:    logging_set_level
 * Signature: (JI)V
 */
JNIEXPORT void JNICALL Java_examples_logging_FastLogging_logging_1set_1level
  (JNIEnv *, jclass, jlong, jint);
...

如何避免 javac 在创建的函数名称中插入“1”,例如

Java_examples_logging_FastLogging_logging_1set_1level

java java-native-interface
1个回答
0
投票

JNI 命名约定非常稳定,多年没有改变。

由于某种原因,生成的方法名称中的

1
似乎是一个问题。虽然我不明白问题是什么,如果您想避免它们,只需避免在本机方法名称中使用下划线即可。请参阅 JNI 方法命名规范 以了解该规范以及预期的其他转换:

下划线 (_, U+005F) ->

_1

顺便说一句,Java 约定不在方法名称中使用下划线,因此最好避免完全使用它们。

© www.soinside.com 2019 - 2024. All rights reserved.