К сожалению, вы не можете просто вызвать любую старую функцию C из Java. Вы должны использовать функцию с «искаженным» именем или использовать механизм JNI_OnLoad. В любом случае виртуальная машина Dalvik добавит дополнительные аргументы к вызову функции, которых обычная функция lame get_version_number
не ожидает.
Этот пример использования JNI объясняет искажение имени. Для вашего Java-класса вам понадобится функция с этим прототипом:
void Java_de_goddchen_android_youtubeconverter_LameWrapper_get_11lame_11version
(JNIEnv *, jclass, jcharArray, jint, jcharArray);
Аргументы JNIEnv и jclass являются частью вызывающего интерфейса. Не забудьте указать extern "C"
, если вы используете C ++. Инструмент javah создаст правильный файл заголовка для вас.
Если бы я делал это, я бы, вероятно, написал функции-оболочки JNI C для нужных вызовов lame. В этом конкретном случае вместо использования char *
с аргументом длины и передачи пустого char *
в качестве последнего аргумента я бы создал более простой интерфейс Java to C, который только что возвратил Java String
. Итак, в Java:
package de.goddchen.android.youtubeconverter;
public class LameWrapper {
public static native String getVersion();
}
Затем в C, который вызывает реальный хромой API:
JNIEXPORT jstring JNICALL Java_de_goddchen_android_youtubeconverter_LameWrapper_getVersion
(JNIEnv * env, jclass c)
{
char buffer[80];
get_lame_version(buffer, sizeof(buffer) - 1, "");
return (*env)->NewStringUTF(env, buffer));
}
Жизненный цикл созданной здесь новой строки затем контролируется на стороне Java / Dalvik.