Java 拥有包时发生JNI致命错误

Java 拥有包时发生JNI致命错误,java,c++,java-native-interface,Java,C++,Java Native Interface,如果我将java文件放在一个包中(如jni/test/),执行时会出现致命错误。但是如果我不把文件放在一个包里,一切都会好的 有包裹时: javac jni/test/Main.java javah -jni jni.test.Main g++ -shared -o libfoo.so -I/usr/lib/jvm/java-7-openjdk-i386/include -I/usr/lib/jvm/java-7-openjdk-i386/include/linux Main.cpp jav

如果我将java文件放在一个包中(如jni/test/),执行时会出现致命错误。但是如果我不把文件放在一个包里,一切都会好的

有包裹时:

javac jni/test/Main.java 
javah -jni jni.test.Main
g++ -shared -o libfoo.so -I/usr/lib/jvm/java-7-openjdk-i386/include -I/usr/lib/jvm/java-7-openjdk-i386/include/linux Main.cpp 
java -Djava.library.path=. jni/test/Main

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0xb6c1ce3c, pid=3704, tid=3060386624
#
# JRE version: 7.0_25-b30
# Java VM: OpenJDK Server VM (23.7-b01 mixed mode linux-x86 )
# Problematic frame:
# V  [libjvm.so+0x436e3c]  get_method_id(JNIEnv_*, _jclass*, char const*, char const*, bool, Thread*) [clone .isra.106]+0x7c
#
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
# An error report file with more information is saved as:
# /home/idle/workspace/JNITest/src/hs_err_pid3704.log
#
# If you would like to submit a bug report, please include
# instructions on how to reproduce the bug and visit:
#   https://bugs.launchpad.net/ubuntu/+source/openjdk-7/
#
Aborted
javac Main.java
javah -jni Main
g++ -shared -o libfoo.so -I/usr/lib/jvm/java-7-openjdk-i386/include -I/usr/lib/jvm/java-7-openjdk-i386/include/linux Main.cpp 
java -Djava.library.path=. Main

//This executes fine
没有软件包时:

javac jni/test/Main.java 
javah -jni jni.test.Main
g++ -shared -o libfoo.so -I/usr/lib/jvm/java-7-openjdk-i386/include -I/usr/lib/jvm/java-7-openjdk-i386/include/linux Main.cpp 
java -Djava.library.path=. jni/test/Main

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0xb6c1ce3c, pid=3704, tid=3060386624
#
# JRE version: 7.0_25-b30
# Java VM: OpenJDK Server VM (23.7-b01 mixed mode linux-x86 )
# Problematic frame:
# V  [libjvm.so+0x436e3c]  get_method_id(JNIEnv_*, _jclass*, char const*, char const*, bool, Thread*) [clone .isra.106]+0x7c
#
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
# An error report file with more information is saved as:
# /home/idle/workspace/JNITest/src/hs_err_pid3704.log
#
# If you would like to submit a bug report, please include
# instructions on how to reproduce the bug and visit:
#   https://bugs.launchpad.net/ubuntu/+source/openjdk-7/
#
Aborted
javac Main.java
javah -jni Main
g++ -shared -o libfoo.so -I/usr/lib/jvm/java-7-openjdk-i386/include -I/usr/lib/jvm/java-7-openjdk-i386/include/linux Main.cpp 
java -Djava.library.path=. Main

//This executes fine
我有两个java类

public class Animal {
    public String name = null;
    public int age = 0;
}

public class Main {    
    public native Animal nativeFoo();    

    static {
        System.loadLibrary("foo");
    }        

    public void print () {
        Animal a = nativeFoo();
        System.out.println(a.name + " " + a.age);
    }

    public static void main(String[] args) {
    (new Main()).print();
    }
}
<> C++部分< /P>
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Main */

#ifndef _Included_Main
#define _Included_Main
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     Main
 * Method:    nativeFoo
 * Signature: ()LAnimal;
 */

//if the java file in a package
//JNIEXPORT jobject JNICALL Java_jni_test_Main_nativeFoo (JNIEnv *env, jobject obxj)

JNIEXPORT jobject JNICALL Java_Main_nativeFoo
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif
/*不要编辑此文件-它是机器生成的*/
#包括
/*类Main的标题*/
#ifndef(包括主管道)
#定义包含的主
#ifdef_uucplusplus
外部“C”{
#恩迪夫
/*
*类别:主要
*方法:nativeFoo
*签字:()拉尼马尔;
*/
//如果java文件在包中
//JNIEXPORT作业对象JNICALL Java_jni_test_Main_nativeFoo(JNIEnv*env,作业对象Obj)
JNIEXPORT作业对象JNICALL Java\u Main\u nativeFoo
(JNIEnv*,jobject);
#ifdef_uucplusplus
}
#恩迪夫
#恩迪夫
cpp文件

#include "Main.h"
//if the java file in a package
//JNIEXPORT jobject JNICALL Java_jni_test_Main_nativeFoo (JNIEnv *env, jobject obxj)

JNIEXPORT jobject JNICALL Java_Main_nativeFoo (JNIEnv *env, jobject obxj){
    jclass animal = env->FindClass("Animal");
    jmethodID cons = env->GetMethodID(animal, "<init>", "()V");
    jobject obj = env->NewObject(animal, cons);

    jfieldID age = env->GetFieldID(animal, "age", "I");
    jfieldID name = env->GetFieldID(animal, "name", "Ljava/lang/String;");

    env->SetObjectField(obj, name, env->NewStringUTF("awww"));
    env->SetIntField(obj, age, 23);
    return obj;
}
#包括“Main.h”
//如果java文件在包中
//JNIEXPORT作业对象JNICALL Java_jni_test_Main_nativeFoo(JNIEnv*env,作业对象Obj)
JNIEXPORT作业对象JNICALL Java_Main_nativeFoo(JNIEnv*env,作业对象Obj){
jclass animal=env->FindClass(“动物”);
jmethodidcons=env->GetMethodID(动物,“,”()V”);
jobject obj=env->NewObject(动物,cons);
jfieldID age=env->GetFieldID(动物,“年龄”,“我”);
jfieldID name=env->GetFieldID(动物,“名称”,“Ljava/lang/String;”);
env->SetObjectField(obj,name,env->NewStringUTF(“awww”);
环境->设置输入字段(对象,年龄,23岁);
返回obj;
}

根据错误,即当通过
env->GetMethodID()
调用
get_method\u id(JNIEnv.*,\u jclass*,char const*,char const*,bool,Thread*)
时,您的jclass变量
animal
为空

FindClass调用失败,因为它找不到类“Animal”

验证类名和包定义是否正确


请参见

如果包含本机方法的Java类在包中或不在包中,则.h和.c文件必须不同。从你的问题中不清楚你是否欣赏这个。当然它不同,它是自动生成的。我编辑了我的帖子,并把它放在了ClarityIt的评论中。我没有包括包裹,哈哈哈好傻。非常感谢。