09▀30≈ß # @ ÷ g отображается, когда я не прошел эту строку - PullRequest
2 голосов
/ 02 сентября 2011

Я пытаюсь передать строку в собственную функцию c, но строка выводится как 09▀30≈ß#@÷g для строки Type a String :.Я не знаю, в чем проблема.

Это код, который я использовал для этого:

КОД JAVA

class Prompt {

private native String myGetLine( String prompt ); // native method that prints a prompt and reads a line 

public static void main( String args[] ) {
Prompt prompt = new Prompt();
String input = prompt.myGetLine( "Type a String : ");
System.out.println("User Typed : " + input);
}

static {
 System.loadLibrary("StringPassing"); // StringPassing.dll
 }
}

C CODE

#include <jni.h>
#include <stdio.h>
#include "D:\UnderTest\JNI\StringPassing\Debug\Prompt.h"

JNIEXPORT jstring JNICALL Java_Prompt_myGetLine(JNIEnv *env, jobject obj, jstring str) {
char buf[128];
const jbyte *str_JVM;
str_JVM = (*env) -> GetStringUTFChars( env , str , NULL);
if( str_JVM == NULL ) return NULL;
printf("%s ",str);
(*env)->ReleaseStringUTFChars( env , str , str_JVM);
scanf("%s",buf);
return (*env)->NewStringUTF( env , buf);
}

Экран после завершения программы выглядит следующим образом:

D:\UnderTest\JNI\StringPassing\Debug>java Prompt
09▀30≈ß#@÷gV
User Typed : V

Почему я не получаю строку Type a String : на cmd, когдая запускаю программу?

Также: мой компилятор подчеркивает (*env) и указывает, что Выражение должно иметь тип указателя .Но когда я компилирую, я не получаю никаких ошибок.Почему это так и что это?

Ответы [ 2 ]

3 голосов
/ 02 сентября 2011

Вы передаете str printf, когда я почти уверен, что вы хотите передать str_JVM вместо него.

str_JVM = (*env) -> GetStringUTFChars( env , str , NULL);
if( str_JVM == NULL ) return NULL;
printf("%s ",str_JVM);
0 голосов
/ 30 августа 2013

Что касается второй части вашего вопроса, JNIEnv объявлен как параметр для Java_Prompt_myGetLine как этот тип:

JNIEnv *env

Это переводится на английский как "Объявить переменную env, которая является указателемк объекту типа JNIEnv ".Оператор -> в C и C ++ используется для доступа к членам экземпляра структуры или класса из указателя, однако ожидается, что левая часть оператора -> будет указателем.Этот оператор " разыменовывает " указатель.Ссылка на указатель такова: *env означает «дать мне объект, на который указывает env».Это также разыменовывает указатель.

Проблема, о которой говорит ваша среда IDE, заключается в том, что строки, подобные этой (в вашем коде есть 3 вхождения), являются технически недопустимым кодом, поскольку *Оператор 1014 * ожидает указатель на левой стороне, но вы уже разыменовали указатель с помощью (*env), поэтому ваш код передает ему объект вместо указателя:

return (*env)->NewStringUTF( env , buf);

Ваш компиляторна самом деле очень прощает, позволяя этой компиляции все равно.Чтобы исправить это, измените строку на:

return env->NewStringUTF( env , buf);

-OR-

return (*env).NewStringUTF( env , buf);

Обычно первая строка используется чаще (выглядит чище).

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