déménagement tronqué erreur : R_X86_64_32 contre le symbole
Je teste un exemple simple de jni (sur windows 7) par l'appel de fonctions java en c++ principal.
J'ai lu que la réinstallation tronqué" erreur est due à un grand projet (pas le cas : il suffit d'une main et d'une compilés classe java nommée Échantillon avec une méthode statique intMethod(int)), reliant les fichiers objets dans un ordre différent (je n'ai qu'un fichier objet), ou d'un vaste système de correspondance ... débordement de la pile de thread
J'utilise la suite de la compilation en ligne de commande:
g++ -D __int64="long long" -I"C:\Program Files\Java\jdk1.7.0_55\include" -I"C:\Program Files\Java\jdk1.7.0_55\include\win32" -L"C:\Program Files\Java\jdk1.7.0_55\lib" -o sample sample.cpp -ljvm
et ma fonction principale:
#include <jni.h>
#include <cstring>
#ifdef _WIN32
#define PATH_SEPARATOR ';'
#else
#define PATH_SEPARATOR ':'
#endif
int main()
{
JavaVMOption options[1];
JNIEnv *env;
JavaVM *jvm;
JavaVMInitArgs vm_args;
long status;
jclass cls;
jmethodID mid;
jint square;
jboolean no;
options[0].optionString ="-Djava.class.path=.";
//memset(&vm_args, 0, sizeof(vm_args));
vm_args.version = JNI_VERSION_1_6;
vm_args.nOptions = 1;
vm_args.options = options;
status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
cls = env->FindClass("Sample");
mid = env->GetStaticMethodID(cls, "intMethod", "(I)I");
if(mid !=0)
{ square = env->CallStaticIntMethod(cls, mid);
printf("Result of intMethod: %d\n", square);
}
jvm->DestroyJavaVM();
return 0;
}
L'erreur est la suivante:
C:\Program Files\Java\jdk1.7.0_55\lib/jvm.lib(jvm.dll.b):(.texte+0x2): relocalisation tronqué: R_X86_64_32 contre le symbole __imp_JNI_CreateJavaVM défini dans l'article .idata 5$C:\Program Files\Java\jdk1.7.0_55\lib/jvm.lib(jvm.dll.b)
erreur: collect2: ld a retourné 1 code de sortie
N'arrive pas à trouver une bonne réponse de n'importe où sur la façon de gérer cette erreur méthodiquement!
-> Solution:
Ajoutez-L"C:\Program Files\Java\jdk1.7.0_55\jre\bin\server" dans la compilation
OriginalL'auteur JHAA | 2014-06-23
Vous devez vous connecter pour publier un commentaire.
De clarifier la solution éditée dans la question, l'éditeur de liens de ligne de commande doit inclure
-L/path/to/jre/bin/server
(qui contientjvm.dll
). Il ne doit PAS contenir-L/path/to/jdk/lib
(qui contientjvm.lib
).Je ne suis pas familier avec les classiques de développement de Windows donc je ne peux pas expliquer ce qui se passe ici. Je suppose que l'interlocuteur a été de travailler sur Cygwin comme moi.
Notez que ce que vous exécutez le programme,
/path/to/jre/bin/server
doit également être sur votrePATH
(répondant à la même fonction queLD_LIBRARY_PATH
sur Linux).OriginalL'auteur mhsmith
La troncation est en se référant à la stockées réinstallation de décalage, pas le symbole de l'étiquette. Je crois que votre solution peut être trouvée ici.
OriginalL'auteur technomage