我正在尝试使用JNI将Java swing前端链接到c ++后端。我能够为该类生成一个类文件和头文件。我也可以编写.cpp文件并生成库文件。但是当我尝试运行我的应用程序时,我得到一个错误未定义的符号:__ gxx_personality_v0。 我在stackoverflow上经历了很多例子,但在我的情况下没有一个工作。我确定我有libgcc,libgcj和libstd ++。还在JNI头文件的顶部添加了pragma GCC java_exceptions。 但这些都没有奏效。
Java文件 - InitJNI.java
public class InitJNI {
public native String callMethod(String str);
public static void init(String s){
System.out.println("-------inside InitJNI.java--------");
System.loadLibrary("eg1");
System.out.println("Library loaded in InitJNI--------");
InitJNI init1 = new InitJNI();
init1.callMethod(s);
}
}
JNI头文件 - InitJNI.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class org_openscience_jchempaint_application_InitJNI */
#ifndef _Included_InitJNI
#define _Included_InitJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: InitJNI
* Method: callMethod
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_InitJNI_callMethod
(JNIEnv *, jobject, jstring);
#ifdef __cplusplus
}
#endif
#endif
Cpp文件 - InitJNI.cpp
#include "InitJNI.h"
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#pragma GCC java_exceptions
JNIEXPORT jstring JNICALL Java_InitJNI_callMethod
(JNIEnv * env, jobject, jstring string){
char buf[128];
const char *str = env->GetStringUTFChars(string, NULL);
printf("%s", str);
env->ReleaseStringUTFChars(string, str);
}
我正在尝试使用命令创建共享库:
g++ -shared -fpic -o libeg1.so -I/usr/java/include -I/usr/java/include/linux InitJNI.cpp
生成libeg1.so文件。但我的应用程序没有运行。它给了我 未定义的符号:__ gxx_personality_v0 对此有任何帮助表示赞赏。 谢谢!