我有一个以
开头的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
?
JNI 命名约定非常稳定,多年没有改变。
由于某种原因,生成的方法名称中的
1
似乎是一个问题。虽然我不明白问题是什么,如果您想避免它们,只需避免在本机方法名称中使用下划线即可。请参阅 JNI 方法命名规范 以了解该规范以及预期的其他转换:
下划线 (_, U+005F) ->
_1
顺便说一句,Java 约定不在方法名称中使用下划线,因此最好避免完全使用它们。