2016-11-20 6 views
1

Я получаю ошибку компиляции для следующего заголовка файла:C++ Ошибка компиляции для JNI: неизвестное имя типа JNIEnv JINT JavaVM

#include <jni.h> 

#ifdef __cplusplus 
extern "C" { 
#endif 

typedef struct { 
    jint x1; 
    jint y1; 
    jint x2; 
    jint y2; 
} Bounds; 

... 

#ifdef __cplusplus 
}; 
#endif 

Есть другие ссылки JNI, например, к jobject, JNIEnv, JavaVM, и т. д. Не жалуется, что заголовок < jni.h> отсутствует (это было, но это было легко исправлено путем добавления пути include). Я проверил файл заголовка, и типы определены в этом заголовке (и < jni_md.h> тоже).

Это не имеет никакого смысла для меня. Есть идеи?

EDIT: Я забыл включить следующий текст ошибки.

g++ -O2 -fPIC -fpermissive -I. -I.. -I/usr/include -I/usr/local/include/libavcodec -I/usr/local/include/libavdevice -I/usr/local/include/libavformat -I/usr/local/include/libswscale -I/System/Library/Frameworks/JavaVM.framework/Versions/A/Headers -DUNIX -shared -c -o Plugin.o Plugin.cpp 
clang: warning: argument unused during compilation: '-shared' 
In file included from Plugin.cpp:19: 
In file included from Plugin.h:16: 
Data.h:24:5: error: unknown type name 'jint' 
    jint x1; 
    ^
Data.h:25:5: error: unknown type name 'jint' 
    jint y1; 
    ^
Data.h:26:5: error: unknown type name 'jint' 
    jint x2; 
    ^
Data.h:27:5: error: unknown type name 'jint' 
    jint y2; 
    ^
+2

Включите ли вы полный текст ошибки? – Leon

+1

Может быть - см. Http://stackoverflow.com/questions/7212982/ –

+0

@ZabojCampula, как я уже сказал, у меня нет проблемы с поиском заголовков, они включены. –

ответ

1

код C не имеет никаких очевидных ошибок, и это компилируется, если среда разработки правильно настроен. Таким образом, предполагаемая область является средой разработки, и, вероятно, отсутствуют или повреждены файлы заголовков JNI.

Компилятор C предоставляет опцию -E, которая и компилятор запускает препроцессор только при применении этой опции. Вывод может быть проанализирован, содержит места, где файлы заголовков были найдены расширенными ifdefs и т. Д.

Выход препроцессора показывает неправильный файл jni.h. Решение состоит в том, чтобы правильно настроить проект, включая пути, которые включают правильный jni.h.

0

Это действительно странно.

Вы можете посмотреть на очень похожий код, который компилирует прекрасно здесь:

https://github.com/mkowsiak/jnicookbook/tree/master/recipeNo025 

Только одно замечание в вашем случае. В то время как вы скомпилировать код, не используйте

-shared 

Вы должны использовать его при построении общей библиотеки:

# compile the code 
g++ -O2 -fPIC -fpermissive -I/System/Library/Frameworks/JavaVM.framework/Versions/A/Headers -DUNIX -c -o c/recipeNo025_HelloWorld.o c/recipeNo025_HelloWorld.cpp 

# make shared lib out of it 
g++ -g -shared c/recipeNo025_HelloWorld.o -o lib/libHelloWorld.$(EXT) 
Смежные вопросы