Другие ответы технически правильны, но не очень полезны для тех, кто не имеет опыта JNI. : -)
Обычно для того, чтобы JVM могла найти ваши собственные функции, они должны быть названы определенным образом. например, для java.lang.Object.registerNatives
соответствующая функция C называется Java_java_lang_Object_registerNatives
. Используя registerNatives
(или, точнее, функцию JNI RegisterNatives
), вы можете называть свои функции на C как хотите.
Вот соответствующий код C (из OpenJDK 6):
static JNINativeMethod methods[] = {
{"hashCode", "()I", (void *)&JVM_IHashCode},
{"wait", "(J)V", (void *)&JVM_MonitorWait},
{"notify", "()V", (void *)&JVM_MonitorNotify},
{"notifyAll", "()V", (void *)&JVM_MonitorNotifyAll},
{"clone", "()Ljava/lang/Object;", (void *)&JVM_Clone},
};
JNIEXPORT void JNICALL
Java_java_lang_Object_registerNatives(JNIEnv *env, jclass cls)
{
(*env)->RegisterNatives(env, cls,
methods, sizeof(methods)/sizeof(methods[0]));
}
(Обратите внимание, что Object.getClass
отсутствует в списке; он по-прежнему будет вызываться «стандартным» именем Java_java_lang_Object_getClass
.) Для перечисленных функций соответствующие функции C перечислены в той таблице, которая удобнее, чем писать кучу функций пересылки.
Регистрация собственных функций также полезна, если вы встраиваете Java в вашу C-программу и хотите ссылаться на функции внутри самого приложения (в отличие от общей библиотеки) или используемые функции не «экспортируются» в противном случае. , поскольку они обычно не могут быть найдены стандартным механизмом поиска метода. Регистрация собственных функций также может быть использована для «повторного связывания» собственного метода с другой функцией C (полезно, например, если ваша программа поддерживает динамическую загрузку и выгрузку модулей).
Я призываю всех прочесть книгу JNI , в которой говорится об этом и многом другом. : -)