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++中的运算符<代码> ->代码>用于从指针访问结构或类实例的成员,但是,*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>