導航:首頁 > 編程語言 > 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相關的資料

熱點內容
屍吻完整高清版免費看 瀏覽:713
深圳投簡歷到哪個網站 瀏覽:290
大數據解析網路交友 瀏覽:271
無線網卡未識別的網路 瀏覽:36
女大學生的客房沙龍女主角叫什麼名字 瀏覽:486
有額度能提現的app 瀏覽:683
java定時任務timer 瀏覽:194
ps原文件存不了 瀏覽:481
怎麼徹底刪除微博數據 瀏覽:923
媒體評論馬化騰微信 瀏覽:744
好13網址大全 瀏覽:774
網路雙絞線 瀏覽:948
linux系統鏡像文件在 瀏覽:647
帕薩特如何用道通讀取鏈條數據 瀏覽:962
電影台灣三級小電影 瀏覽:636
誰有看片網址 瀏覽:461
win10中卸載顯示器 瀏覽:626
拳頭和天激斗 瀏覽:129
樹莓派雙核mcu怎麼編程 瀏覽:331

友情鏈接