簡體   English   中英

C ++無法使用JNI在Java類中找到構造函數

[英]C++ cannot find constructor in Java Class using JNI

使用以下代碼,我可以調用靜態方法(因此,我的類路徑可能是正確的),但是JNI GetMethodID方法無法在同一類中找到構造函數:

java_test.cpp C ++ 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;
}

JavaTest MWE:

package javatest;

public class Sample
{
  int myint;

  public Sample(int n)
  {
      myint = n;
      System.out.println("[JavaTest] Instantiated");
  }

  public static int intMethod (int n)
  {
    return n*n*n;
  }

  public static void printMethod( )
  {
    System.out.println("Hello World!");
  }
}

輸出總是

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

有任何想法嗎? JNI的大多數其他問題與不正確的類路徑有關,但是通過靜態方法判斷此示例具有正確的路徑。

不了解Java反匯編程序javap。 運行

$ javap -s JavaTest.class

顯示正確的簽名是(I)V。

更改:

jmethodID constructor_method_id = env->GetMethodID( cls, "<init>", "V(I)" );

至:

jmethodID constructor_method_id = env->GetMethodID( cls, "<init>", "(I)V" );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM