Замена имени функции с помощью определения макроса в cpp правильно - PullRequest
5 голосов
/ 09 января 2012

Я использую библиотеки Eclipse + Qualcomm (в cpp) + Android SDK в Ubuntu. Мое приложение работает нормально. Если я изменю код в библиотеках qualcomm, он скомпилируется и будет работать правильно.

Проблема в том, что я изменил название проекта, и мне нужно изменить какой-то код в cpp (название функции), если я не сделаю это, я получу Java.lang.UNSATISFIEDLINKERROR.

Это потому, что все функции имеют название в виде пакета Android, например:

Java_org_myproject_marker_MainActivity_onQCARInitializedNative(JNIEnv *, jobject)

Затем я определяю макрос следующим образом:

#define MAIN_ACTIVITY_PREFIX org_myproject_marker_MainActivity
#define VISUALIZER_PREFIX org_myproject_marker_Visualizer

И я изменяю все правильные функции следующим образом:

Java_MAIN_ACTIVITY_PREFIX_onQCARInitializedNative(JNIEnv *, jobject)

но я все еще получаю исключение Java.lang.UNSATISFIEDLINKERROR.

Это работает, если я делаю это без макроса #define (и пишу все строки), но я хочу сохранить код cpp с верхним определением, которое автоматически изменит все, если мне понадобится использовать его в других проектах.

Я прочитал этот урок . Разве я не могу заменить текст внутри другого текста или что-то в этом роде?

Ответы [ 2 ]

7 голосов
/ 09 января 2012

Действительно, макрос CPP не будет раскрываться в середине идентификатора.Попробуйте с

 #define MAIN_ACTIVITY_PREFIX(func) Java_org_myproject_marker_MainActivity##func

Это даст вам макрос, который добавит Java_org_myproject_marker_MainActivity к имени передаваемой вами функции.Используйте это как:

MAIN_ACTIVITY_PREFIX(_onQCARInitializedNative)(JNIEnv *, jobject) {
    ...
}
7 голосов
/ 09 января 2012

вы ищете конкатенацию строк, например:

#define MAIN_ACTIVITY_PREFIX(n) Java_org_myproject_marker_MainActivity##n

, а затем используйте его так:

MAIN_ACTIVITY_PREFIX(_onQCARInitializedNative)(JNIEnv *, jobject)
...