导航:首页 > 编程语言 > jninewjstring

jninewjstring

发布时间:2021-02-27 00:05:17

⑴ JNI编程之如何传递参数(一)——String参数的传递

先看一个例子,class Prompt { // native method that prints a prompt and reads a line private native String getLine(String prompt); public static void main(String args[]) { Prompt p = new Prompt(); String input = p.getLine("Type a line: "); System.out.println("User typed: " +input); } static { System.loadLibrary("Prompt"); } }在这个例子中,我们要实现一个native方法 String getLine(String prompt); 读入一个String参数,返回一个String值。通过执行javah -jni得到的头文件是这样的#include #ifndef_Included_Prompt #define_Included_Prompt #ifdef __cplusplus extern"C" { #endif JNIEXPORT jstringJNICALL Java_Prompt_getLine(JNIEnv *env, jobject this, jstring prompt); #ifdef __cplusplus } #endif #endifjstring是JNI中对应于String的类型,但是和基本类型不同的是,jstring不能直接当作C++的string用。如果你用 cout GetStringUTFChars(prompt, false); 将jstring类型变成一个char*类型。返回的时候,要生成一个jstring类型的对象,也必须通过如下命令,

⑵ 如何在JNI中使用String类型

在NDK中自带了一个最简单的sample,从JNI返回一个string给Java,是这么用的:
#include <string.h>
#include <jni.h>
/* This is a trivial JNI example where we use a native method
* to return a new VM String. See the corresponding Java source
* file located at:
*
* apps/samples/hello-jni/project/src/com/example/hellojni/HelloJni.java
*/
jstring
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
jobject thiz )
{
return (*env)->NewStringUTF(env, "Hello from JNI !");
}
~如果你认可我的回答,请及时点击【采纳为满意回答】按钮
~~手机提问的朋友在客户端右上角评价点【满意】即可。
~你的采纳是我前进的动力
~~O(∩_∩)O,记得好评和采纳,互相帮助,谢谢。

⑶ 在JNI中如何将jobject类型转换为jdouble类型

#include<jni.h>
#include"com_test_Test.h"
#include<stdio.h>
#include<stdlib.h>
#include<strings.h>

//获取字符串
JNIEXPORTvoidJNICALLJava_com_test_Test_sayHello(JNIEnv*env,jobjectobj,
jstrings){

char*str=(char*)(*env)->GetStringUTFChars(env,s,0);
printf(" c-string:hello-%s",str);

}

//获取,返回int
JNIEXPORTjintJNICALLJava_com_test_Test_add(JNIEnv*env,jobjectobj,
jinta,jintb){
inti=a;
intj=b;
printf(" c-int:%d-%d",i,j);
charstr[256];
sprintf(str,"%d",i+j);
return(jint)i+j;
}

//获取,返回float
JNIEXPORTjfloatJNICALLJava_com_test_Test_getFloat(JNIEnv*env,jobjectobj,
jfloatf){
floatfl=f;
printf(" c-float:%3f",fl);

fl=200.555;
return(jfloat)fl;
}

//获取,返回double
JNIEXPORTjdoubleJNICALLJava_com_test_Test_getDouble(JNIEnv*env,
jobjectobj,jdoubledou){
doubled=dou;
printf(" c-double:%3f",d);

d=800.88;
return(jdouble)d;
}

//获取,返回boolean
JNIEXPORTjbooleanJNICALLJava_com_test_Test_getBoolean(JNIEnv*env,
jobjectobj,jbooleanbool){

unsignedcharb=bool;
printf(" c-boolean:%lu",b);
if(b){
printf("true");
}else{
printf("false");
}

b=1;
return(jboolean)b;
}

//获取,返回string
JNIEXPORTjstringJNICALLJava_com_test_Test_getString(JNIEnv*env,
jobjectobj,jstrings){
char*st=(char*)(*env)->GetStringUTFChars(env,s,0);
printf(" c-string:%s",st);

char*str="hellowangwu!";
jstringrtn;
rtn=(*env)->NewStringUTF(env,str);
returnrtn;
}

//获取,返回string[]
_com_test_Test_getStringArray(JNIEnv*env,
jobjectobj,jobjectArrayarr){
intlen=(*env)->GetArrayLength(env,arr);
printf(" c-stringArray:");
inti=0;
for(i=0;i<len;i++){
jobjectobj=(*env)->GetObjectArrayElement(env,arr,i);
jstringstr=(jstring)obj;
constchar*szStr=(*env)->GetStringUTFChars(env,str,0);
printf("%d-%s",i,szStr);
(*env)->ReleaseStringChars(env,str,szStr);
}
//-----返回----

jstringstr;
jobjectArrayargs=0;
jsizesize=5;
char*sa[]={"Hello,","world!","zhang","san","yuang"};
intj=0;
jclassobjClass=(*env)->FindClass(env,"java/lang/String");
args=(*env)->NewObjectArray(env,size,objClass,0);
for(j=0;j<size;j++){
str=(*env)->NewStringUTF(env,sa[j]);
(*env)->SetObjectArrayElement(env,args,j,str);
}
returnargs;
}

-----------------------------------------------------------------

下面是Test.java

packagecom.test;

publicclassTest{
privatenativevoidsayHello(Stringstr);

privatenativeintadd(inta,intb);

privatenativefloatgetFloat(floatf);

privatenativedoublegetDouble(doubled);

(booleanb);

privatenativeStringgetString(Stringstr);

privatenativeString[]getStringArray(String[]sa);

static{
System.loadLibrary("Test");
}

publicstaticvoidmain(String[]args){
Testtest=newTest();
test.sayHello("zhangsan");
System.out.println("int-->"+test.add(10,20));
System.out.println("float-->"+test.getFloat((float)20.123));
System.out.println("double-->"+test.getDouble(100.369));
System.out.println("boolean-->"+test.getBoolean(true));
System.out.println("string-->"+test.getString("wangWu"));

String[]ss={"hello","-","zhang","san"};
Object[]obj=test.getStringArray(ss);
System.out.print("string[]-->");
for(Objectobject:obj){
System.out.print(object+"");
}

}

}

⑷ jni方法重载的问题

应该是来没有问题的,jni是支持源重载方法的,他是把重载方法转换成C语言的两个不同方法,方法名是不一样的。我怀疑你的问题是由于dll没有用最新的。你可以把sayhello方法名修改成display,然后重新走一遍jni的操作过程,看看是什么效果。
下面是这个问题和你是一样的
http://www.javaworld.com.tw/jute/post/view?bid=5&id=240725

⑸ 如何解决jni char转化为jstring乱码问题

java内部是使用16bit的unicode编码(UTF-16)来表示字符串的,无论中文英文都是2字节; jni内部是使用UTF-8编码来表示字符串的,UTF-8是变长编码的unicode,一般ascii字符是1字节,中文是3字节; c/c++使用的是原始数据,ascii就是一个字节了,中文一般是GB2312编码,用两个字节来表示一个汉字。
明确了概念,操作就比较清楚了。下面根据字符流的方向来分别说明一下
1、java --> c/c++
这种情况中,java调用的时候使用的是UTF-16编码的字符串,jvm把这个字符串传给jni,c/c++得到的输入是jstring,这个时候,可以利用jni提供的两种函数,一个是GetStringUTFChars,这个函数将得到一个UTF-8编码的字符串;另一个是 GetStringChars这个将得到UTF-16编码的字符串。无论那个函数,得到的字符串如果含有中文,都需要进一步转化成GB2312的编码。

2、c/c++ --> java
jni返回给java的字符串,c/c++首先应该负责把这个字符串变成UTF-8或者UTF-16格式,然后通过NewStringUTF或者NewString来把它封装成jstring,返回给java就可以了。
如果字符串中不含中文字符,只是标准的ascii码,那么使用GetStringUTFChars/NewStringUTF就可以搞定了,因为这种情况下,UTF-8编码和ascii编码是一致的,不需要转换。
但是如果字符串中有中文字符,那么在c/c++部分进行编码转换就是一个必须了。我们需要两个转换函数,一个是把UTF8/16的编码转成GB2312;一个是把GB2312转成UTF8/16。
这里要说明一下:Linux和win32都支持wchar,这个事实上就是宽度为16bit的unicode编码UTF16,所以,如果我们的 c/c++程序中完全使用wchar类型,那么理论上是不需要这种转换的。但是实际上,我们不可能完全用wchar来取代char的,所以就目前大多数应用而言,转换仍然是必须的。

二、一种转换方法
使用wide char类型来转换。
char* jstringToWindows( JNIEnv *env, jstring jstr )
{ //UTF8/16转换成gb2312
int length = (env)->GetStringLength(jstr );
const jchar* jcstr = (env)->GetStringChars(jstr, 0 );
char* rtn = (char*)malloc( length*2+1 );
int size = 0;
size = WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)jcstr, length, rtn,(length*2+1), NULL, NULL );
if( size <= 0 )
return NULL;
(env)->ReleaseStringChars(jstr, jcstr );
rtn[size] = 0;
return rtn;
}

jstring WindowsTojstring( JNIEnv* env, const char* str )
{//gb2312转换成utf8/16
jstring rtn = 0;
int slen = strlen(str);
unsigned short * buffer = 0;
if( slen == 0 )
rtn = (env)->NewStringUTF(str );
else
{
int length = MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, NULL, 0 );
buffer = (unsigned short *)malloc( length*2 + 1 );
if( MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, (LPWSTR)buffer, length ) >0 )
rtn = (env)->NewString( (jchar*)buffer, length );
}
if( buffer )
free( buffer );
return rtn;
}

⑹ JNI中如何把char * 转化为jstring

//获取java String类方法String(byte[],String)的构造器,用于将本地byte[]数组转换为一个新String
jmethodID ctorID = (env)-GetMethodID(strClass, "<init", "([BLjava/lang/String;)V");
//建立内byte数组
jbyteArray bytes = (env)-NewByteArray((jsize)strlen(pat));
//将char* 转换为byte数组
(env)-SetByteArrayRegion(bytes, 0, (jsize)strlen(pat), (jbyte*)pat);
//设置容String, 保存语言类型,用于byte数组转换至String时的参数
jstring encoding = (env)-NewStringUTF("utf-8");
//将byte数组转换为java String,并输出

⑺ 将const char类型转换成jstring类型中的 NewStringUTF("GB2312");是何含义

jstring
encoding
=
(env)->NewStringUTF("GB2312");
这句只是得到一个内容为“GB2312”的jstring字符串而已,因为这个字符串后面NewObject创建jstring时,jstring的构造函数需要用到(想想你在JAVA里将byte数组转换为一个GB2312编码的String会怎么做,你会需要在构造函数那明确写一个“GB2312“这样的参数)。
总而言之,你这里给出的所有代码的目的就是:将一个C语言中的char*字符串转换为编码为GB2312的JAVA字符串(在JNI中用jstring代表)并返回。

⑻ 如何在JNI中使用String类型

在NDK中自带了一个最简单的sample,从JNI返回一个string给Java,是回这么用的答:

#include<string.h>
#include<jni.h>
/*
*toreturnanewVMString.SeethecorrespondingJavasource
*filelocatedat:
*
*apps/samples/hello-jni/project/src/com/example/hellojni/HelloJni.java
*/
jstring
Java_com_example_hellojni_HelloJni_stringFromJNI(JNIEnv*env,
jobjectthiz)
{
return(*env)->NewStringUTF(env,"HellofromJNI!");
}

⑼ 将const char类型转换成jstring类型中的 NewStringUTF("GB2312");是何含义

jstring encoding = (env)->NewStringUTF("GB2312");
这句只是得到一个内容为“GB2312”的jstring字符串而已,因为这个字符串后回面NewObject创建jstring时,jstring的构造函答数需要用到(想想你在JAVA里将byte数组转换为一个GB2312编码的String会怎么做,你会需要在构造函数那明确写一个“GB2312“这样的参数)。
总而言之,你这里给出的所有代码的目的就是:将一个C语言中的char*字符串转换为编码为GB2312的JAVA字符串(在JNI中用jstring代表)并返回。

⑽ JNI传递类对象的问题,如何获取long类型

你的JNI接口定义抄错误,在Java层传袭入了4个参数,你的JNI接口只有一个参数。

JNIEXPORTjintJNICALLJava_org_jniInterface_CommitTask_myReceiveMsg
(JNIEnv*env,jclassobj,jinit,jint,jstring,jobjectjobj)

前两个参数是默认的,从第三个开始是你需要对应的java接口的参数

阅读全文

与jninewjstring相关的资料

热点内容
韩国电影爱情推理片大全疯狂列爱 浏览:482
吉吉影音播放资源网址 浏览:427
李采谭主演电影合集 浏览:675
父子之间的禁忌by似梦非梦 浏览:160
主角叫阿尔法 丢蛋的变龙 浏览:474
黑人离职电影 浏览:921
家教高级课程扮演者 浏览:698
app9800com/vod/1.html 浏览:854
和鸭王一样的电影 浏览:4
电影院一般有多大 浏览:336
古天乐大湾仔电影 浏览:689
可以看英语电影的软件 浏览:966
外国两个男的在火车上看到女人喂小孩奶 浏览:165
免费看片的网站你懂得 浏览:874
手机word查找 浏览:656
黑人英语老师 浏览:195
含糖1v1荔枝txt下载 浏览:529
红羊出品的真军电影都有哪些 浏览:85
韩污网站 浏览:900
checkboxjs取值 浏览:731

友情链接