如何在另一个 C 任务中调用 JNI 的 C 方法?

How to call a C mehod of JNI in another C task?

我实现了一个 JNI 方法来处理对象并返回一个值。

这个方法有点复杂,有很多JNI分配。

我想使用 GDB 调试我的 JNI 方法并使用 Valgrind 检查它的内存,但是使用 javam 这个任务听起来很复杂。

所以我的问题是,是否可以创建一个调用 JNI 函数的 C 函数,接近于 java 的调用方式?

像这个例子:

JNIEXPORT jint JNICALL Java_test_Test_func (JNIEnv *env, jobject obj, jstring jstr){
    const char *p_str;
    p_str = (*env)->GetStringUTFChars(env, jstr, 0);
    return char[2];
}

int main(int argc, char **argv){
    JNIEnv env;
    jstring test = env->NewStringUTF(env, "vals");
    printf("%d\n", Java_test_Test_func(&env, NULL, test));
    //Expects: 108
    return 0;
}

您需要先实际创建 VM,请参阅 Chapter 5 of the JNI documentation。 这将为您提供一个 jvm,您可以从中获取一个 JNIEnv *env 并调用您的函数。

也就是说,您也可以正常启动您的 Java 进程,将调试器附加到它并在您的函数上放置一个断点,就像处理任何其他本机程序一样。