【发布时间】:2014-08-13 16:45:07
【问题描述】:
我正在通过在 c++ main 中调用 java 函数来测试一个简单的 jni 示例(在 Windows 7 上)。
我读到“重定位被截断以适应”错误是由于一个大型项目(不是这种情况:只是一个名为 Sample 的 main 和一个编译的 java 类,带有一个静态方法 intMethod(int)),链接不同的目标文件订单(我只有一个目标文件),或扩展映射方案...stack overflow thread
我使用以下编译命令行:
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
和我的主要功能:
#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;
}
错误如下:
C:\Program Files\Java\jdk1.7.0_55\lib/jvm.lib(jvm.dll.b):(.text+0x2):重定位被截断以适应:R_X86_64_32 对 .idata 节中定义的符号 __imp_JNI_CreateJavaVM $5 在 C:\Program Files\Java\jdk1.7.0_55\lib/jvm.lib(jvm.dll.b)
错误:collect2:ld 返回 1 个退出状态
似乎在任何地方都找不到关于如何有条不紊地处理此错误的好答案!
-> 解决方法: 在编译中添加-L"C:\Program Files\Java\jdk1.7.0_55\jre\bin\server"
【问题讨论】:
标签: compiler-errors jvm java-native-interface g++