jni中字符串传递问题

changleqy 2007-12-17 04:01:19
我现在使用JNI,想实现一个小功能。
在JAVA中定义了一个字符串
char[] x=new char[3];
x[0]='a';
x[1]='b';
x[2]='c';

现在我想在C++里面实现两个功能,
1:读取x的内容并在C++里输出
2:修改x里的内容为x[0]='x',x[1]='y',x[2]='z'。

//函数格式
JNIEXPORT jlong JNICALL Java_T1210_Test_test_1x(JNIEnv *env, jobject obj)
{

jclass clazz_Native=env-> GetObjectClass(obj);
//此处不知道如何读取JAVA中的x[]数据
// 此处不知道如何设置JAVA中的x[]数据
return 1;
}

希望高手能帮忙帮我补上这个功能!
十分感谢!
...全文
96 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangxccom 2007-12-17
  • 打赏
  • 举报
回复
我这有个在用的程序,在其中也有怎样处理字符串。供参考

#include <jni.h>
#include "yxc_sap_mdapi_ManipulationDataAPI.h"
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <Winnls.h>
#include <string.h>
#include "caddialg.h"

extern "C"

char* jstringToWindows(JNIEnv* env,jstring jstr );
jstring windowsToJstring( JNIEnv* env, char* str );

JNIEXPORT jstring JNICALL Java_yxc_sap_mdapi_ManipulationDataAPI_CreateMat(JNIEnv* env, jobject obj, jstring snd){
char sndstr[16500];
SAPHD hd;
char *rcvstr;
char *sapmes;
char *version;
char *retstr;
char *argv[1];
char* cha="CreateMat";
argv[0]=cha;

/* Connect: Parameters about SAP system, user name and password */
/* will be read in configuration file cadrfc.ini. */

//argc = argc; /* only for compiler purpose RM600 */

hd=SapVersi(&version);
//printf("SAP-CAD function library, interface version: %s\n",version);
//printf("-------------------------------------------------\n");
//printf("\n");

hd = SapConnc(argv,"","","","","","","",&sapmes);

//printf("CONNC --- CPIC-RC=%ld\n",hd.cpicrc);
//printf("--------------------\n");
if (hd.cpicrc != 0){
//printf("Received CPIC-Error: %s\n\n",hd.cpicmes);
//exit(1);
strcpy(retstr,hd.cpicmes);
jstring jstr=windowsToJstring(env,retstr);
return jstr;
}

char* chs=jstringToWindows(env,snd);
//printf(chs);
//printf("\n");
//char* chars1="13600008 1000 11MPARTtest-1007000 EA ND001005KP7910S001 活塞连杆总成 KG 20260 ";
//printf(chars1);
//printf("\n");
//创建物料

strcpy(sndstr,chs);
//strcpy(sndstr,"13600008 1000 11MPARTtest-1007000 EA ND001005KP7910S001 活塞连杆总成 KG 20260 ");
hd = SapMatcr("MR",sndstr,&rcvstr,&sapmes);

//printf("MATRQ --- CPIC-RC=%ld\n",hd.cpicrc);
//printf("--------------------\n");
if (hd.cpicrc == 0) {
//printf("Sended Data: %s\n",sndstr);
//rcvstr[hd.datalen] = 0x0;
//printf("Received Data: %s\n",rcvstr);
//sapmes[hd.meslen] = 0x0;
//printf("Received Message: %s\n\n",sapmes);
strcpy(retstr,sapmes);
}
else {
//printf("Received CPIC-Error: %s\n\n",hd.cpicmes);
strcpy(retstr,hd.cpicmes);
jstring jstr=windowsToJstring(env,retstr);
return jstr;
//exit(1);
}

hd = SapDisco();
//printf("DISCO --- CPIC-RC=%ld\n",hd.cpicrc);
//printf("createMat is disconnect!");

jstring jstr=windowsToJstring(env,retstr);
return jstr;
}

JNIEXPORT jstring JNICALL Java_yxc_sap_mdapi_ManipulationDataAPI_CreateBOM(JNIEnv* env, jobject obj, jstring header, jstring items){
char sndstr[16500];
SAPHD hd;
char *rcvstr;
char *sapmes;
//char *version;
char *retstr;
char *argv[1];
char* cha="CreateBOM";
argv[0]=cha;

//hd=SapVersi(&version);

hd = SapConnc(argv,"","","","","","","",&sapmes);

if (hd.cpicrc != 0){
strcpy(retstr,hd.cpicmes);
jstring jstr=windowsToJstring(env,retstr);
return jstr;
}

char* chs=jstringToWindows(env,header);

int length = env->GetStringLength(items);;
char* items1="";
if(length>0){
items1=jstringToWindows(env,items);
}

//新建BOM
strcpy(sndstr,chs);
hd = SapBomcr("MP",sndstr,&rcvstr,&sapmes);

if (hd.cpicrc != 0) {
strcpy(retstr,hd.cpicmes);
jstring jstr=windowsToJstring(env,retstr);
return jstr;
}

strcpy(sndstr,items1);
hd = SapBomcr("SP",sndstr,&rcvstr,&sapmes);

if (hd.cpicrc == 0) {
strcpy(retstr,sapmes);
}
else {
strcpy(retstr,hd.cpicmes);
jstring jstr=windowsToJstring(env,retstr);
return jstr;
}

hd = SapDisco();

jstring jstr=windowsToJstring(env,retstr);
return jstr;
}

///////////////////////////////////////////////////////////////////////////////
//辅助函数:char* jstringToWindows(JNIEnv* env,jstring jstr);
//功能:将Java的Unicode字符串转化成本地字符数组;
///////////////////////////////////////////////////////////////////////////////
char* jstringToWindows(JNIEnv* env,jstring jstr )
{
//AFX_MANAGE_STATE(AfxGetStaticModuleState());
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, char* str )
//功能:将本地字符数组转化成Java的Unicode字符串;
///////////////////////////////////////////////////////////////////////////////
jstring windowsToJstring( JNIEnv* env, char* str )
{
//AFX_MANAGE_STATE(AfxGetStaticModuleState());
jstring rtn = 0;
int slen = strlen(str);
wchar_t* buffer = 0;
if( slen == 0 )
rtn = env->NewStringUTF(str); //UTF ok since empty string
else
{
int length = MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, NULL, 0 );
buffer = (wchar_t*)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;
}

太长,从中删除了一部分

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧