Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;在使用JNI的Java类中找不到构造函数_Java_C++_Constructor_Java Native Interface - Fatal编程技术网

C++;在使用JNI的Java类中找不到构造函数

C++;在使用JNI的Java类中找不到构造函数,java,c++,constructor,java-native-interface,Java,C++,Constructor,Java Native Interface,使用以下代码,我可以调用静态方法(因此我的类路径应该是正确的),但JNI GetMethodID方法无法在同一个类中找到构造函数: JavaaTest.CPPC++ MWE: #include <jni.h> #include <cstring> int main( void ) { JNIEnv * env; JavaVM * jvm; JavaVMOption options[1]; JavaVMInitArgs vm_args;

使用以下代码,我可以调用静态方法(因此我的类路径应该是正确的),但JNI GetMethodID方法无法在同一个类中找到构造函数:

JavaaTest.CPPC++ MWE:

#include <jni.h>
#include <cstring>

int main( void )
{
    JNIEnv * env;
    JavaVM * jvm;
    JavaVMOption options[1];
    JavaVMInitArgs vm_args;
    long status;

    options[0].optionString = (char*)"-Djava.class.path=/home/kadmin/workspace/kata/JavaTest/build/classes";
    memset( &vm_args, 0, sizeof( vm_args ) );
    vm_args.version = JNI_VERSION_1_2;
    vm_args.nOptions = 1;
    vm_args.options = options;
    status = JNI_CreateJavaVM( &jvm, (void**)&env, &vm_args );

    if ( status == JNI_ERR )
    {
        return 1;
    }

    /* Call static method to cube x */
    jclass cls = env->FindClass( "javatest/Sample" );
    jmethodID int_method_id = env->GetStaticMethodID( cls, "intMethod", "(I)I" );
    int x = 5;
    jint cubed = env->CallStaticIntMethod( cls, int_method_id, x );
    printf("(%i)^3 = %i\n", x, cubed );

    /* Call static method to print "Hello World!" */
    jmethodID print_method_id = env->GetStaticMethodID( cls, "printMethod", "()V" );
    env->CallStaticVoidMethod( cls, print_method_id );

    /* Attempt to instantiate `Sample' class */
    jmethodID constructor_method_id = env->GetMethodID( cls, "<init>", "V(I)" );
    if ( constructor_method_id != 0 )
    {
        jobject jobj = env->NewObject( cls, constructor_method_id );
    }
    else
    {
        printf("`Sample' constructor not found.\n");
    }

    return 0;
}
输出总是

$ ./java_test
(5)^3 = 125
Hello World!
`Sample' constructor not found.

有什么想法吗?JNI的大多数其他问题都与不正确的类路径有关,但从静态方法来看,这个示例具有正确的路径。

不知道java Disassembler javap。运行

$ javap -s JavaTest.class
表明正确的签名是(I)V

更改:

jmethodID constructor_method_id = env->GetMethodID( cls, "<init>", "V(I)" );
jmethodID构造函数\u method\u id=env->GetMethodID(cls,“,”V(I)”;
致:

jmethodID构造函数方法id=env->GetMethodID(cls,”,“(I)V”);

顺序当然重要。谁说不是?为什么文档应该明确地说?寓意:不要猜测JNI方法签名。使用“javap-s”的输出。这从来没有错。
jmethodID constructor_method_id = env->GetMethodID( cls, "<init>", "V(I)" );
jmethodID constructor_method_id = env->GetMethodID( cls, "<init>", "(I)V" );