2009-07-28 3 views
0

J'essaye de compiler une bibliothèque de JNI qui emploie le carbone de la ligne de commande.Quand sont -framework et -I/System /.../ Example.framework/Headers/needed?

Si je ne -I/System /.../ JavaVM.Framework/Headers /, il ne trouve aucun des types jni, et donne des erreurs. Si je ne fais que -I/System /.../ FlatCarbon.framework/Headers, mais pas "-framework Carbon", il compile bien, mais l'éditeur de liens donne une erreur sur un symbole indéfini.

Si je compile avec -Cadre Carbon, ça marche bien, mais il s'avère que le -I .../FlatCarbon.framework/Headers/était totalement inutile! Cela fonctionne de la même manière avec ou sans. Maintenant, tout a un sens, sauf pour ce qui suit:

Si je -framework JavaVM, mais ne pas inclure le répertoire d'en-tête, alors ne peut pas trouver les types jni!

Cela semble totalement incohérent. Pour un framework, le -I est requis, et le -framework est optionnel, pour l'autre, le -framework est requis, et -I est optionnel. Comment est-ce ainsi? Quelqu'un pourrait-il expliquer comment fonctionne l'option -framework? JavaVM est-il un cas particulier? Je publie partiellement cette question par curiosité, mais aussi pour aider toute personne qui cherchait une solution similaire, car au moins avec mon google-fu, je n'ai pas pu trouver quelque chose expliquant les frameworks de la commande , ou comment lier aux bibliothèques système avec gcc sur la ligne de commande. gcc --help ne documente même pas le cadre, et tout ce que j'ai pu trouver était de développer avec xcode.

Répondre

1

"-framework" est suffisant pour l'étape de compilation et l'étape de liaison. Je suppose que votre code JNI ne fait pas correctement référence à l'en-tête jni.h (il manque probablement la référence à l'infrastructure JavaVM englobante).

code comme:

#include <JavaVM/jni.h> 

JNIEXPORT jstring JNICALL Java_SomeClass_getStr(JNIEnv *env, jobject obj) 
{ 
    jstring javaName = (*env)->NewString(env, (jchar *)"ana", (jsize)3); 
    return javaName; 
} 

avec se compile:

gcc -dynamiclib My.c -o My.o -framework JavaVM 
1

cadre sont considérés à la fois pour la compilation et la liaison. Je ne connais rien à Java, mais peut-être que votre problème est lié aux bundles vs. framework: plusieurs frameworks peuvent être inclus dans un bundle, par exemple. A framework may contain other frameworks as well.

Malheureusement, ce type de contenu spécifique à mac n'est généralement pas documenté dans les pages man.