Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.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
Java 09▀;30≈ß#@÷;当我没有传递此字符串时,将显示g_Java_C_Unicode_Utf 8_Java Native Interface - Fatal编程技术网

Java 09▀;30≈ß#@÷;当我没有传递此字符串时,将显示g

Java 09▀;30≈ß#@÷;当我没有传递此字符串时,将显示g,java,c,unicode,utf-8,java-native-interface,Java,C,Unicode,Utf 8,Java Native Interface,我试图将字符串传递给本机c函数,但该字符串被打印为09▀30≈ß#@g对于字符串键入字符串:。我不知道是什么问题 这是我用来做这件事的代码: 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

我试图将字符串传递给本机
c
函数,但该字符串被打印为
09▀30≈ß#@g
对于字符串
键入字符串:
。我不知道是什么问题

这是我用来做这件事的代码:

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
 }
}
#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);
}
C代码

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
 }
}
#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);
}
为什么我在运行程序时不在cmd上获取字符串
键入字符串:


另外:我的编译器在
(*env)
下面加下划线,并指出表达式必须具有指针类型。但是当我编译时,我没有得到任何错误。这是为什么?这是什么?

您将
str
传递给
printf
,而我很确定您想将
str\u JVM
传递给它

str_JVM = (*env) -> GetStringUTFChars( env , str , NULL);
if( str_JVM == NULL ) return NULL;
printf("%s ",str_JVM);

关于问题的第二部分,JNIEnv被声明为
Java\u Prompt\u myGetLine
的一个参数,类型如下:

JNIEnv *env
这在英语中翻译为“声明一个名为env的变量,该变量是指向JNIEnv类型对象的指针”。C和C++中的运算符<代码> ->代码>用于从指针访问结构或类实例的成员,但是, -> > /Cord>运算符的左侧预期是指针。此运算符“”表示指针。引用这样的指针:
*env
意味着“给我env指向的对象”。这也是指针

IDE告诉您的问题是,像这样的行(在上面的代码中出现了3次)在技术上是非法代码,因为
->
操作符希望指针位于左侧,但您已经使用
(*env)
解除了对指针的引用,因此,您的代码向其传递的是对象而不是指针:

return (*env)->NewStringUTF( env , buf);
您的编译器实际上非常宽容,不管怎样都让它编译。要更正此错误,请将行更改为:

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


通常第一行是比较常见的用法(看起来比较干净)。

你能解释一下问题的第二部分吗?不,对不起。我的C知识非常有限,其他人必须查看这个部分。你使用哪一个编译器?@ Joababito to <代码>微软Visual C++ 2010 Express < /C>。为什么?想知道C和C++ API之间有什么区别吗?在C中,env的用法与
(*env)->GetStringUTFChars(env,str,NULL)一样。在C++中,它将是<代码> Env> > GestStrugUfFARS(STR,NULL)< /COD>