Java 如何在JNI中实例化类

Java 如何在JNI中实例化类,java,android,android-ndk,java-native-interface,Java,Android,Android Ndk,Java Native Interface,我感到惊讶的是,这个非常重要的细节在互联网上缺少全面的演练。或许我是最差的谷歌搜索者。或者一个完全愚蠢的程序员 我已经在android上工作了几个月,但是最近我被告知要做JNI。我的C技能已经生锈了。然而,当我坚持这一点,无法继续前进时,我正在迎头赶上 我想要一些简单的东西。这是我在MainActivity中的本机方法声明 公共本机对象createObject() 这就是我打算如何使用它 Object abc = createObject(); Integer num = (In

我感到惊讶的是,这个非常重要的细节在互联网上缺少全面的演练。或许我是最差的谷歌搜索者。或者一个完全愚蠢的程序员

我已经在android上工作了几个月,但是最近我被告知要做JNI。我的C技能已经生锈了。然而,当我坚持这一点,无法继续前进时,我正在迎头赶上

我想要一些简单的东西。这是我在MainActivity中的本机方法声明

公共本机对象createObject()

这就是我打算如何使用它

    Object abc = createObject();
    Integer num = (Integer) abc;
我只想从C创建一个java.lang.Integer对象,并将其发送到java。再简单不过了

    jobject Java_com_example_hellojni_HelloJni_callbackJava(JNIEnv * env, jobject this )
{
    jclass cls = (*env)->FindClass(env, "java/lang/Integer");
    jmethodID methodID = (*env)->GetMethodID(env, cls, "<init>", "(I)V");
    jint number = 8 ; 
    return (*env)->NewObject(cls, methodID, number);

}
请帮帮我


谢谢

我犯了一个小错误,我通过对JNI的更多搜索和研究发现了这个错误

我没有在NewObject的参数中加入env。下面是正确的代码,以防任何人需要它

jobject Java_com_example_hellojni_HelloJni_createObject(JNIEnv * env, jobject this )
{

    jclass cls = (*env)->FindClass(env, "java/lang/Integer");
    jmethodID methodID = (*env)->GetMethodID(env, cls, "<init>", "(I)V");
    jobject a=(*env)->NewObject(env,cls, methodID, 5);
    return a;
}
jobject Java\u com\u示例\u hellojni\u hellojni\u createObject(JNIEnv*env,jobject this)
{
jclass cls=(*env)->FindClass(env,“java/lang/Integer”);
jmethodID=(*env)->GetMethodID(env,cls,”,“(I)V”);
jobject a=(*env)->NewObject(env,cls,methodID,5);
返回a;
}

虽然它不能回答您的问题,但您应该使用Integer.valueOf()。@ignis感谢您的评论。是的,我正在寻找一种在JNI中实例化类的方法。我现在的动机就是要了解这一点。有很多关于从JNI创建Java类的例子,尽管为什么你想编写一个实现这一点的JNI方法,而其他任何事情我都无法完全理解。JNI报告的错误是误导性的,你可能永远陷在其中,公平地说,虚拟机希望出现JNIEnv*,代码正在传递一个jclass。这应该是通过编译器警告检测到的,虽然这可能不会发生在C绑定中,因为JOBECTOPES定义为“代码> VUL**/CODE >(C++绑定有一个“假”类层次结构)。CheckJNI消息通常是准确的,与简单的崩溃消息相比是一个巨大的改进。
jobject Java_com_example_hellojni_HelloJni_createObject(JNIEnv * env, jobject this )
{

    jclass cls = (*env)->FindClass(env, "java/lang/Integer");
    jmethodID methodID = (*env)->GetMethodID(env, cls, "<init>", "(I)V");
    jobject a=(*env)->NewObject(env,cls, methodID, 5);
    return a;
}