给我发邮件吧,我给你一篇我在《开放系统世界》中发表的关于C/C++中调用JAVA的文章![email protected]
解决方案 »
- jsp连接odbc问题
- 请教如何用正则表达式表示这个字符串
- 如何让一个int变量引用不允许引用某个特定值 (急,在线等)
- 奇怪的紧急问题,以前好好的代码,现在对数组的类型转化抛异常
- java中这样一句话:<%out.print("数据库操作成功,恭喜你");%> 这句话中“<%”,“%>”什么作用啊!
- 菜鸟求助
- 做个C/S系统,客户端如何读写服务端的文件?
- 我下了一个JDK 1.4.2 怎么用不了!
- 急!JBuilder中出现的问题!!!!!!!!!!!!!!!!!!!!!!1
- blob数据插入问题:Help!!!!!!!!
- 怎么把读到byte[4]变成float
- 必读]用java编程的人进来看看!!!!
已经给你发邮件了,看到赶快给我发一个吧,谢谢
这个问题很急,希望知道的告诉我一声怎么解决
thanks~
我也知道是这个问题
可是用这种方法还是得不到这个fid
你能不能给我一个例子?
谢谢~
{
int nA;
String sA;
public static void main(String[] args) {
B ab = new B();
ab.aB = new A();
ab.testObject(ab);
}
}
class B
{
A aB;
public native void testObject(B b);
static {
System.loadLibrary("test");
}
}// Test.cpp : Defines the entry point for the DLL application.
//#include "stdafx.h"
#include "B.h"JNIEXPORT void JNICALL Java_B_testObject(JNIEnv *env, jobject obj, jobject binst) {
jclass cls = env->GetObjectClass(binst); //obj是传入的参数,得到的是B类的实例
jfieldID fid = env->GetFieldID(cls,"aB","LA;"); //得到aB属性的fid
jobject aObject = env->GetObjectField(cls,fid);//得到A类对象
if (aObject != NULL) {
jclass aCls = env->GetObjectClass(aObject);//得到A类对象的实例
}
}
可是怎么在c语言的方法中得到String类型的sA然后赋值给c语言的char[]数组呢?
谢谢~
jstring WindowsTojstring(JNIEnv* env, char* str)
{
jstring rtn = 0;
jsize len = strlen(str); jclass clsstring = env->FindClass("java/lang/String"); //new encode string default "GBK"
jstring strencode = env->NewStringUTF(CURRENT_ENCODE);
jmethodID mid = env->GetMethodID(clsstring, "<init>", "([BLjava/lang/String;)V");
jbyteArray barr = env->NewByteArray(len); env->SetByteArrayRegion(barr,0,len,(jbyte*)str); //call new String(byte[] b,String encode)
rtn = (jstring)env->NewObject(clsstring,mid,barr,strencode); return rtn;
}char* jstringToWindows(JNIEnv* env, jstring jstr)
{
char* rtn = NULL;
jclass clsstring = env->FindClass("java/lang/String"); //new encode string default "GBK"
jstring strencode = env->NewStringUTF(CURRENT_ENCODE);
jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B"); //call String.getBytes method to avoid incompatible migrating into solaris
jbyteArray barr= (jbyteArray)env->CallObjectMethod(jstr,mid,strencode); jsize alen = env->GetArrayLength(barr);
jbyte* ba = env->GetByteArrayElements(barr,JNI_FALSE); if(alen > 0)
{
rtn = (char*)malloc(alen+1); //new char[alen+1];
memcpy(rtn,ba,alen);
rtn[alen]=0;
}
env->ReleaseByteArrayElements(barr,ba,0); return rtn;
}
这个方法不能用
也看不出是哪里的缘故
请指教~
我一使用这个方法就出现jvm异常
也不清楚是什么缘故了
:(
在windows下运行就没有问题
Function=[Unknown. Nearest: JVM_IsSameClassPackage+0x7338]
Library=/usr/j2se/jre/lib/sparc/client/libjvm.soCurrent Java thread:
at B.testObject(Native Method)
at B.main(B.java:10)Dynamic libraries:
0x10000 java
0xff350000 /usr/lib/libthread.so.1
0xff390000 /usr/lib/libdl.so.1
0xff200000 /usr/lib/libc.so.1
0xff340000 /usr/platform/SUNW,Netra-T4/lib/libc_psr.so.1
0xfe000000 /usr/j2se/jre/lib/sparc/client/libjvm.so
0xff2e0000 /usr/lib/libCrun.so.1
0xff1e0000 /usr/lib/libsocket.so.1
0xff100000 /usr/lib/libnsl.so.1
0xff0d0000 /usr/lib/libm.so.1
0xff310000 /usr/lib/libw.so.1
0xff0b0000 /usr/lib/libmp.so.2
0xff080000 /usr/j2se/jre/lib/sparc/native_threads/libhpi.so
0xff050000 /usr/j2se/jre/lib/sparc/libverify.so
0xfe7c0000 /usr/j2se/jre/lib/sparc/libjava.so
0xff030000 /usr/j2se/jre/lib/sparc/libzip.so
0xfdee0000 /usr/lib/locale/en_US.ISO8859-1/en_US.ISO8859-1.so.2
0xfa3a0000 /users/judic/libtest.soLocal Time = Thu Jul 10 09:49:02 2003
Elapsed Time = 0
#
# HotSpot Virtual Machine Error : 11
# Error ID : 4F530E43505002E6 01
# Please report this error at
# http://java.sun.com/cgi-bin/bugreport.cgi
#
# Java VM: Java HotSpot(TM) Client VM (1.4.1_03-b02 mixed mode)
#
# An error report file has been saved as hs_err_pid4310.log.
# Please refer to the file for further information.
#
Abort (core dumped)
这是出错信息
jsize alen = env->GetArrayLength(barr);
这是你给的方法出错的地方
如果我把size用参数传递进去,这句话略去,那么
jbyte* ba = env->GetByteArrayElements(barr,JNI_FALSE);
这句语句出错了
我的程序牵涉到太多的其他包
所以发不上来
我传递进去的jstring是“1234”(在java这里是这样的)
我得到jstring之后用
jchar* sPin = (jchar*)env->GetStringChars(pin,0);
然后将jchar(unsigned short*)转换到char*
可是这怎么转换我不是很清楚,可以用for循环来实现吧?
(jchar*)env->GetStringChars(pin,0); 来处理了
因为我的消息里面没有中文的
全是英文系统现在暂时没有其他问题了
感谢您的大力帮助,我终于走通了jni调用c语言实现的编码方法,具体实现可能还有其他问题
请告诉我你的邮件地址吧?有问题再向你请教
thanks & Regards
出现了如下错误:为什么?
d:\cproject\javajde\jde_jdeoperationmanager.c(17) : error C2223: left of '->FindClass' must point to struct/union
用c++来实现
又麻烦你了
我想把char*转换成jstring,可是使用你的方法运行出现下面的异常:
Exception in thread "main" java.lang.NoSuchMethodError: sun.io.ByteToCharGBK.getIndex1()[S
at sun.nio.cs.ext.GBK$Decoder.<init>(GBK.java:45)
at sun.nio.cs.ext.GBK.newDecoder(GBK.java:33)
at java.lang.StringCoding$CharsetSD.<init>(StringCoding.java:164)
at java.lang.StringCoding$CharsetSD.<init>(StringCoding.java:155)
at java.lang.StringCoding.decode(StringCoding.java:211)
at java.lang.String.<init>(String.java:327)
at java.lang.String.<init>(String.java:356)
at com.utstar.wcdma.hlr.Coder.decodeAuth(Native Method)
at com.utstar.wcdma.hlr.Coder.main(Coder.java:120)
我使用
char * imsiStr 是一个指针,值是”460123412345678“
const jchar * imsiString是指向const jchar的指针
imsiSize是字符串的长度,这里为15
我使用下面的方法
for(int i = 0; i < imsiSize; i ++)
imsiString[i] = imsiStr[i];
jstring imsi = env->NewString(imsiString, imsiSize);
这样没有错误,可是我在java那边打印出来是乱码。
请帮我看看是什么原因?
Thanks & Regards
而且我里面放的还不是中文阿
全是英文的
这不应该会出现乱码的吧