Не удается вызвать функцию Java из модуля C ++ с помощью JNI - PullRequest
0 голосов
/ 04 июня 2018

Я пытаюсь вызвать функцию класса Java из файла C ++, используя JNI, и у меня всегда происходит сбой.Мой C ++ файл:

#include <jni.h>
#include <string>

extern "C" JNIEXPORT jstring

JNICALL
Java_MyPackage_MyApp_stringFromJNI(JNIEnv *env,jobject     /* this */,int a,jobject v) {
    jclass V = env->GetObjectClass(v);
    jmethodID setName=env->GetMethodID(V,"setName","(Ljava/lang/String;)V");
    env->CallVoidMethod(v,setName,"new name");
    return env->NewStringUTF("Testsss");
}

Проблема возникает, когда я пытаюсь вызвать метод.В logcat я вижу это:

    runtime.cc:500] JNI DETECTED ERROR IN APPLICATION: use of deleted global reference 0x785cd7227ac6
runtime.cc:500]     from java.lang.String MyPackage.MyApp.stringFromJNI(int, MyPackage.V)
runtime.cc:500] "main" prio=5 tid=1 Runnable
runtime.cc:500]   | group="main" sCount=0 dsCount=0 flags=0 obj=0x73f2d670 self=0x785ceecbea00
runtime.cc:500]   | sysTid=7020 nice=-10 cgrp=default sched=0/0 handle=0x785cf3b94a08
runtime.cc:500]   | state=R schedstat=( 167686135 3959959 183 ) utm=14 stm=2 core=2 HZ=100
runtime.cc:500]   | stack=0x7ffe2c4fc000-0x7ffe2c4fe000 stackSize=8MB
runtime.cc:500]   | held mutexes= "mutator lock"(shared held)

Код для моей функции Java:

void setName(String name) {
    this.name = name;
}

Любая идея о том, что может быть причиной проблемы?

1 Ответ

0 голосов
/ 04 июня 2018

Вы не можете вызвать метод следующим образом:

env->CallVoidMethod(v,setName,"new name");

Вы должны сначала создать строку Java, а затем передать это:

jstring str = env->NewStringUTF("new name");
env->CallVoidMethod(v, setName, str);

В противном случаеВМ пытается интерпретировать переданный const char* как глобальную ссылку на j.l.String.Но он не может его найти, поэтому вы получаете эту ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...