@@ -16,16 +16,28 @@ public static string FixupType (this string t)
1616 partial class Generator
1717 {
1818 static string jnienv_g_c ;
19+ static string jnienv_g_h ;
1920 static string jnienv_g_cs ;
2021
2122 public static int Main ( string [ ] args )
2223 {
2324 jnienv_g_c = "JniEnvironment.g.c" ;
25+ jnienv_g_h = "JniEnvironment.g.h" ;
2426 jnienv_g_cs = "JniEnvironment.g.cs" ;
2527 if ( args . Length > 0 )
2628 jnienv_g_cs = args [ 0 ] ;
27- if ( args . Length > 1 )
29+ if ( args . Length > 1 ) {
2830 jnienv_g_c = args [ 1 ] ;
31+ if ( jnienv_g_c != "-" ) {
32+ jnienv_g_h = Path . ChangeExtension ( jnienv_g_c , ".h" ) ;
33+ } else {
34+ jnienv_g_h = "-" ;
35+ }
36+ }
37+ if ( args . Length > 2 ) {
38+ jnienv_g_h = args [ 2 ] ;
39+ }
40+
2941 try {
3042 using ( TextWriter w = new StringWriter ( ) ) {
3143 w . NewLine = "\n " ;
@@ -36,14 +48,21 @@ public static int Main (string [] args)
3648 else
3749 File . WriteAllText ( jnienv_g_cs , content ) ;
3850 }
39- using ( TextWriter w = new StringWriter ( ) ) {
40- w . NewLine = "\n " ;
41- GenerateNativeLibSource ( w ) ;
42- string content = w . ToString ( ) ;
43- if ( jnienv_g_c == "-" || jnienv_g_cs == "-" )
44- Console . WriteLine ( content ) ;
45- else
46- File . WriteAllText ( jnienv_g_c , content ) ;
51+ using ( TextWriter sw = new StringWriter ( ) ) {
52+ using ( TextWriter hw = new StringWriter ( ) ) {
53+ sw . NewLine = "\n " ;
54+ GenerateNativeLibSource ( sw , hw , jnienv_g_h ) ;
55+ string sourceContent = sw . ToString ( ) ;
56+ string headerContent = hw . ToString ( ) ;
57+ if ( jnienv_g_c == "-" || jnienv_g_cs == "-" ) {
58+ Console . WriteLine ( headerContent ) ;
59+ Console . WriteLine ( ) ;
60+ Console . WriteLine ( sourceContent ) ;
61+ } else {
62+ File . WriteAllText ( jnienv_g_h , headerContent ) ;
63+ File . WriteAllText ( jnienv_g_c , sourceContent ) ;
64+ }
65+ }
4766 }
4867 return 0 ;
4968 } catch ( Exception ex ) {
@@ -431,67 +450,100 @@ static void RaiseException (TextWriter o, JniFunction entry, HandleStyle style)
431450 o . WriteLine ( ) ;
432451 }
433452
434- static void GenerateNativeLibSource ( TextWriter o )
453+ static void WriteNativeFileHeader ( TextWriter o )
435454 {
436455 o . WriteLine ( "/*" ) ;
437456 o . WriteLine ( " * Generated file; DO NOT EDIT!" ) ;
438457 o . WriteLine ( " *" ) ;
439- o . WriteLine ( " * To make changes, edit Java.Interop/tools/jnienv-gen and rerun" ) ;
458+ o . WriteLine ( " * To make changes, edit Java.Interop/build- tools/jnienv-gen and rerun" ) ;
440459 o . WriteLine ( " */" ) ;
441460 o . WriteLine ( ) ;
442- o . WriteLine ( "#include <jni.h>" ) ;
443- o . WriteLine ( ) ;
444- o . WriteLine ( "typedef jmethodID jstaticmethodID;" ) ;
445- o . WriteLine ( "typedef jfieldID jstaticfieldID;" ) ;
446- o . WriteLine ( "typedef jobject jglobal;" ) ;
447- o . WriteLine ( ) ;
448- o . WriteLine ( "/* VS 2010 and later have stdint.h */" ) ;
449- o . WriteLine ( "#if defined(_MSC_VER)" ) ;
450- o . WriteLine ( ) ;
451- o . WriteLine ( " #define JI_API_EXPORT __declspec(dllexport)" ) ;
452- o . WriteLine ( " #define JI_API_IMPORT __declspec(dllimport)" ) ;
453- o . WriteLine ( ) ;
454- o . WriteLine ( "#else /* defined(_MSC_VER */" ) ;
455- o . WriteLine ( ) ;
456- o . WriteLine ( "\t #define JI_API_EXPORT __attribute__ ((visibility (\" default\" )))" ) ;
457- o . WriteLine ( " #define JI_API_IMPORT" ) ;
458- o . WriteLine ( ) ;
459- o . WriteLine ( "#endif /* !defined(_MSC_VER) */" ) ;
460- o . WriteLine ( ) ;
461- o . WriteLine ( "#if defined(JI_DLL_EXPORT)" ) ;
462- o . WriteLine ( " #define JI_API JI_API_EXPORT" ) ;
463- o . WriteLine ( "#elif defined(JI_DLL_IMPORT)" ) ;
464- o . WriteLine ( " #define JI_API JI_API_IMPORT" ) ;
465- o . WriteLine ( "#else /* !defined(JI_DLL_IMPORT) && !defined(JI_API_IMPORT) */" ) ;
466- o . WriteLine ( " #define JI_API" ) ;
467- o . WriteLine ( "#endif /* JI_DLL_EXPORT... */" ) ;
461+ }
462+
463+ static void GenerateNativeLibSource ( TextWriter source , TextWriter header , string headerName )
464+ {
465+ WriteNativeFileHeader ( source ) ;
466+ WriteNativeFileHeader ( header ) ;
467+
468+ header . WriteLine ( "#if !defined (__JAVA_INTEROP_NATIVE_H)" ) ;
469+ header . WriteLine ( "#define __JAVA_INTEROP_NATIVE_H" ) ;
470+ header . WriteLine ( ) ;
471+ header . WriteLine ( "#include <jni.h>" ) ;
472+ header . WriteLine ( ) ;
473+ header . WriteLine ( "typedef jmethodID jstaticmethodID;" ) ;
474+ header . WriteLine ( "typedef jfieldID jstaticfieldID;" ) ;
475+ header . WriteLine ( "typedef jobject jglobal;" ) ;
476+ header . WriteLine ( ) ;
477+ header . WriteLine ( "#if !defined(JI_NO_VISIBILITY)" ) ;
478+ header . WriteLine ( "\t /* VS 2010 and later have stdint.h */" ) ;
479+ header . WriteLine ( "\t #if defined(_MSC_VER)" ) ;
480+ header . WriteLine ( ) ;
481+ header . WriteLine ( "\t \t #define JI_API_EXPORT __declspec(dllexport)" ) ;
482+ header . WriteLine ( "\t \t #define JI_API_IMPORT __declspec(dllimport)" ) ;
483+ header . WriteLine ( ) ;
484+ header . WriteLine ( "\t #else /* defined(_MSC_VER */" ) ;
485+ header . WriteLine ( ) ;
486+ header . WriteLine ( "\t \t #define JI_API_EXPORT __attribute__ ((visibility (\" default\" )))" ) ;
487+ header . WriteLine ( "\t \t #define JI_API_IMPORT" ) ;
488+ header . WriteLine ( ) ;
489+ header . WriteLine ( "\t #endif /* !defined(_MSC_VER) */" ) ;
490+ header . WriteLine ( ) ;
491+ header . WriteLine ( "\t #if defined(JI_DLL_EXPORT)" ) ;
492+ header . WriteLine ( "\t \t #define JI_API JI_API_EXPORT" ) ;
493+ header . WriteLine ( "\t #elif defined(JI_DLL_IMPORT)" ) ;
494+ header . WriteLine ( "\t \t #define JI_API JI_API_IMPORT" ) ;
495+ header . WriteLine ( "\t #else /* !defined(JI_DLL_IMPORT) && !defined(JI_API_IMPORT) */" ) ;
496+ header . WriteLine ( "\t \t #define JI_API" ) ;
497+ header . WriteLine ( "\t #endif /* JI_DLL_EXPORT... */" ) ;
498+ header . WriteLine ( "#else // JI_NO_VISIBILITY" ) ;
499+ header . WriteLine ( "\t #define JI_API" ) ;
500+ header . WriteLine ( "#endif // JI_NO_VISIBILITY" ) ;
501+ header . WriteLine ( ) ;
502+
503+ if ( headerName != "-" ) {
504+ source . WriteLine ( $ "#include \" { headerName } \" ") ;
505+ }
506+
468507 foreach ( JniFunction entry in JNIEnvEntries ) {
469508 if ( entry . IsPrivate || entry . CustomWrapper )
470509 continue ;
471- o . WriteLine ( ) ;
472- o . WriteLine ( "JI_API {0}" , entry . ReturnType . JniType ) ;
473- o . WriteLine ( "{0} (JNIEnv *env{1}{2}{3})" ,
510+
511+ header . WriteLine (
512+ "JI_API {0} {1} (JNIEnv *env{2}{3}{4});" ,
513+ entry . ReturnType . JniType ,
514+ GetPinvokeName ( entry . Name ) ,
515+ entry . Throws ? ", jthrowable *_thrown" : "" ,
516+ entry . Parameters . Length != 0 ? ", " : "" ,
517+ string . Join ( ", " , entry . Parameters . Select ( p => string . Format ( "{0} {1}" , p . Type . JniType , p . Name ) ) )
518+ ) ;
519+
520+ source . WriteLine ( ) ;
521+ source . WriteLine ( "JI_API {0}" , entry . ReturnType . JniType ) ;
522+ source . WriteLine ( "{0} (JNIEnv *env{1}{2}{3})" ,
474523 GetPinvokeName ( entry . Name ) ,
475524 entry . Throws ? ", jthrowable *_thrown" : "" ,
476525 entry . Parameters . Length != 0 ? ", " : "" ,
477526 string . Join ( ", " , entry . Parameters . Select ( p => string . Format ( "{0} {1}" , p . Type . JniType , p . Name ) ) ) ) ;
478- o . WriteLine ( "{" ) ;
527+ source . WriteLine ( "{" ) ;
479528 bool isVoid = entry . ReturnType . JniType == "void" ;
480529 if ( entry . Throws )
481- o . WriteLine ( "\t *_thrown = 0;" ) ;
482- o . Write ( "\t " ) ;
530+ source . WriteLine ( "\t *_thrown = 0;" ) ;
531+ source . Write ( "\t " ) ;
483532 if ( ! isVoid )
484- o . Write ( "{0} _r_ = " , entry . ReturnType . JniType ) ;
485- o . WriteLine ( "(*env)->{0} (env{1}{2});" ,
533+ source . Write ( "{0} _r_ = " , entry . ReturnType . JniType ) ;
534+ source . WriteLine ( "(*env)->{0} (env{1}{2});" ,
486535 entry . Name ,
487536 entry . Parameters . Length != 0 ? ", " : "" ,
488537 string . Join ( ", " , entry . Parameters . Select ( p => p . Name ) ) ) ;
489538 if ( entry . Throws )
490- o . WriteLine ( "\t *_thrown = (*env)->ExceptionOccurred (env);" ) ;
539+ source . WriteLine ( "\t *_thrown = (*env)->ExceptionOccurred (env);" ) ;
491540 if ( ! isVoid )
492- o . WriteLine ( "\t return _r_;" ) ;
493- o . WriteLine ( "}" ) ;
541+ source . WriteLine ( "\t return _r_;" ) ;
542+ source . WriteLine ( "}" ) ;
494543 }
544+
545+ header . WriteLine ( ) ;
546+ header . WriteLine ( "#endif // __JAVA_INTEROP_NATIVE_H" ) ;
495547 }
496548 }
497549
0 commit comments