2011-12-25 13 views
7

Mentre si lavora con alcune fonti scritte in C++ ho trovato quelle macro:JNIEXPORT e JNICALL in Android NDK

JNIEXPORT return_type JNICALL nome_funzione (...) { Tuttavia, i campioni NDK Android non li usano. Ho letto alcuni documenti di Oracle, ma sono ancora confuso.

Devo necessariamente utilizzarli mentre si lavora con Android NDK?

Una delle ragioni per chiedere - quelli macro della sintassi pausa evidenziando in Eclipse CDT :)

risposta

10

è fondamentalmente un problema di Windows, se si dispone di uno sguardo al jni_md_win32.h di file che viene fornito con Oracle Java JDK questo è la definizione macro:

/* 
* @(#)jni_md.h 1.14 03/12/19 
* 
* Copyright 2004 Sun Microsystems, Inc. All rights reserved. 
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. 
*/ 

#ifndef _JAVASOFT_JNI_MD_H_ 
#define _JAVASOFT_JNI_MD_H_ 

#define JNIEXPORT __declspec(dllexport) 
#define JNIIMPORT __declspec(dllimport) 
#define JNICALL __stdcall 

typedef long jint; 
typedef __int64 jlong; 
typedef signed char jbyte; 

#endif /* !_JAVASOFT_JNI_MD_H_ */ 

Nell'intestazione jni_md_linux.h tali macro sono vuote. Quindi suppongo che finchè non vuoi che il tuo codice nativo venga eseguito in Windows con Oracle JVM puoi rimuovere quelle macro.

+2

E un problema di Linux: '#define JNIEXPORT __attribute__ ((visibilità ("default")))' . Probabilmente è usato con '-fvisibility = hidden' per mantenere basse le dimensioni della tabella di esportazione. La riduzione della dimensione della tabella dei simboli di esportazione riduce il tempo di caricamento dell'oggetto condiviso e le dimensioni binarie. Vedi [Visibility - GCC Wiki] (http://gcc.gnu.org/wiki/Visibility). – jww

1

Verificare che il percorso di inclusione della piattaforma desiderato da Android NDK sia stato aggiunto agli inclusi C \ C++ del progetto. Questo può essere fatto nel modo seguente:

  • Aprire le proprietà del progetto
  • Espandi C/C++ Generale
  • Fare clic su Percorsi e simboli
  • Nella comprende una sezione Aggiungi il percorso della cartella includes della piattaforma desiderata della NDK (ad esempio, $ {} ANDROID_NDK_HOME \ piattaforme \ android-9 \ arch-braccio \ usr \ include)