有人研究过jni吗?有两个问题 1。我在调用native方法时,传递String对象作为参数,但是中文乱码,如何解决这个问题?2。如何在native方法里传递java 对象, 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 问题1,没研究过,可能是字符编码转换的问题。问题2,我的做法是,在本地语言中,写一个跟传过去的Java对象具有相同成员变量的对象或结构。,实际上在本地方法中进行计算的是本地的那个对象或结构的成员变量。 关于第2个问题:public class Fun{ static { System.loadLibrary("sis"); } public static native ArrayList foo(int i, Vector v);}如果要实现这个foo函数;我想问的是:1)如何使用这个传入的Vector对象?2)如何在实现里new一个ArrayList对象,返回,这个new的对象怎么释放? 上面那个例子中编译出来的函数原型如下:/* * Class: com_kkk_aiipclient_JniClient * Method: foo * Signature: (ILjava/util/Vector;)Ljava/util/ArrayList; */JNIEXPORT jobject JNICALL Java_com_kkk_aiipclient_JniClient_foo (JNIEnv * env, jclass clazz, jint i, jobject v){ // 如何使用v ? // 如何new ArrayList,然后return?} Vector 和 ArrayList 传进去没有试过我试过得是自己的一个类class A{} 那么在C/C++中用一个struct A{}/Class 代替。要是Vector 或ArrayList中都是同一种对象,可以变成对象数组传过去 第2个问题可以搞定了,但是中文的问题不知道怎么办。比如我在java中调用native方法的时候传的中文,然后在实现里用const char* msg = env->GetStringUTFChars(inStr,0);这个msg显示出来就是乱码。。 GetStringUTFChars() 得到的是按 UTF-8 编码的字符串;GetStringChars() 得到的是按 Unicode 编码的字符串。总之,都不是 GBK 编码的字符串,如果你直接打印的话,就会是乱码(因为我想你的运行环境缺省的一定是 GBK 字符集)。需要用 C 函数转换一下,比如 wctomb() 搞定,给大家一个类:可以用来在jstring(unicode)和string(char*)之间转换。#include <jni.h>#include <string>using namespace std;class JNIString {private: JNIString (); // Default ctor - disallowedpublic: // Create a new instance from the specified jstring JNIString(JNIEnv* env, const jstring& str) : mEnv (env) { const jchar* jchar_buffer = env->GetStringChars (str, 0); const wchar_t* wchar_buffer = (const wchar_t*)jchar_buffer; int length = wcslen(wchar_buffer); // Deep Copy, in usual case we only need // Shallow Copy as we just need this class to // provide some convenience for handling jstring mJstr = env->NewString (jchar_buffer, length); mChars = new char[wcslen (wchar_buffer) * 2 + 1]; WideCharToMultiByte (CP_ACP, 0, wchar_buffer, length + 1, mChars, length * 2 + 1, NULL, NULL); env->ReleaseStringChars (str, jchar_buffer); mString = mChars; } // Create a new instance from the specified string JNIString(JNIEnv* env, const string& str) : mEnv (env) { int slen = str.length (); jchar* buffer = new jchar[slen]; int len = MultiByteToWideChar (CP_ACP, 0, str.c_str (), str.length (), (wchar_t*)buffer, slen); if (len > 0 && len < slen) buffer[len] = 0; mJstr = env->NewString (buffer, len); delete [] buffer; mChars = new char[str.length () + 1]; strcpy (mChars, str.c_str ()); mString.empty (); mString = str.c_str (); } // Create a new instance as a copy of the specified JNIString JNIString(const JNIString& rhs) : mEnv (rhs.mEnv) { const jchar* jstr = mEnv->GetStringChars (rhs.mJstr, 0); int length = wcslen((wchar_t*)jstr); mJstr = mEnv->NewString (jstr, length); mEnv->ReleaseStringChars (rhs.mJstr, jstr); mChars = new char[strlen (rhs.mChars) + 1]; strcpy (mChars, rhs.mChars); mString = rhs.mString.c_str (); } // Delete the instance and release allocated storage ~JNIString() { delete [] mChars; } // assign a new value to this instance from the given string JNIString & operator =(const string& rhs) { delete [] mChars; int slen = rhs.length (); jchar* buffer = new jchar[slen]; int len = MultiByteToWideChar (CP_ACP, 0, rhs.c_str (), rhs.length (), (wchar_t*)buffer, slen); if (len > 0 && len < slen) buffer[len] = 0; mJstr = mEnv->NewString (buffer, len); delete [] buffer; mChars = new char[rhs.length () + 1]; strcpy (mChars, rhs.c_str ()); mString = rhs.c_str (); return *this; } // Supply operator methods for converting the JNIString to a string // or char*, making it easy to pass JNIString arguments to functions // that require string or char* parameters. string & GetString() { return mString; } operator string() { return mString; } operator const char* () { return mString.c_str (); } operator jstring() { return mJstr; }private: JNIEnv* mEnv; // The enviroment pointer for this native method. jstring mJstr; // A copy of the jstring object that this JNIString represents char* mChars; // Pointer to a ANSI code page char array string mString; // string buffer for holding the "value" of this instance (ANSI code page)}; 问一个另外不相干的问题,JAVA中有没有可用的Tree类?或者谁有写好的?我自己懒得写了。最好带深度优先访问方法。 我们用java来解决实际问题。java技术交流,讨论java的技术细节和最新技术。欢迎中高级程序员加入讨论。QQ群:3001581 resultset.update??? eclipse导入web项目 问一个JDK文档中的Throws问题 请教回调的问题 一个简单的代码,就是不知道那里错了。 一个正则问题 再问JDK1.3设置问题!!!! java是否有API来检测本机所连打印机的型号 textpad + jdk 提示错误! 急!!!请问如何对jar文件进行签名???????? 大家讨论一下:什么情况下使用接口才能发挥接口的优势? 大侠们回忆下基础。顺便帮我解释下呵呵。
问题2,我的做法是,在本地语言中,写一个跟传过去的Java对象具有相同成员变量的对象或结构。,实际上在本地方法中进行计算的是本地的那个对象或结构的成员变量。
public class Fun
{
static { System.loadLibrary("sis"); }
public static native ArrayList foo(int i, Vector v);
}如果要实现这个foo函数;我想问的是:
1)如何使用这个传入的Vector对象?
2)如何在实现里new一个ArrayList对象,返回,这个new的对象怎么释放?
* Class: com_kkk_aiipclient_JniClient
* Method: foo
* Signature: (ILjava/util/Vector;)Ljava/util/ArrayList;
*/
JNIEXPORT jobject JNICALL Java_com_kkk_aiipclient_JniClient_foo
(JNIEnv * env, jclass clazz, jint i, jobject v)
{
// 如何使用v ?
// 如何new ArrayList,然后return?
}
我试过得是
自己的一个类class A{} 那么在C/C++中用一个struct A{}/Class 代替。
要是Vector 或ArrayList中都是同一种对象,可以变成对象数组传过去
但是中文的问题不知道怎么办。比如我在java中调用native方法的时候传的中文,然后在实现里用
const char* msg = env->GetStringUTFChars(inStr,0);
这个msg显示出来就是乱码。。
GetStringChars() 得到的是按 Unicode 编码的字符串。总之,都不是 GBK 编码的字符串,如果你直接打印的话,就会是乱码(因为我想你的运行环境缺省的一定是 GBK 字符集)。需要用 C 函数转换一下,比如 wctomb()
#include <jni.h>
#include <string>
using namespace std;class JNIString {
private: JNIString (); // Default ctor - disallowedpublic: // Create a new instance from the specified jstring
JNIString(JNIEnv* env, const jstring& str) :
mEnv (env) {
const jchar* jchar_buffer = env->GetStringChars (str, 0);
const wchar_t* wchar_buffer = (const wchar_t*)jchar_buffer;
int length = wcslen(wchar_buffer);
// Deep Copy, in usual case we only need
// Shallow Copy as we just need this class to
// provide some convenience for handling jstring
mJstr = env->NewString (jchar_buffer, length); mChars = new char[wcslen (wchar_buffer) * 2 + 1];
WideCharToMultiByte (CP_ACP, 0, wchar_buffer, length + 1,
mChars, length * 2 + 1, NULL, NULL);
env->ReleaseStringChars (str, jchar_buffer); mString = mChars;
} // Create a new instance from the specified string
JNIString(JNIEnv* env, const string& str) :
mEnv (env) {
int slen = str.length ();
jchar* buffer = new jchar[slen];
int len = MultiByteToWideChar (CP_ACP, 0, str.c_str (),
str.length (), (wchar_t*)buffer, slen); if (len > 0 && len < slen)
buffer[len] = 0; mJstr = env->NewString (buffer, len);
delete [] buffer; mChars = new char[str.length () + 1];
strcpy (mChars, str.c_str ()); mString.empty ();
mString = str.c_str ();
} // Create a new instance as a copy of the specified JNIString
JNIString(const JNIString& rhs) :
mEnv (rhs.mEnv) {
const jchar* jstr = mEnv->GetStringChars (rhs.mJstr, 0);
int length = wcslen((wchar_t*)jstr);
mJstr = mEnv->NewString (jstr, length);
mEnv->ReleaseStringChars (rhs.mJstr, jstr); mChars = new char[strlen (rhs.mChars) + 1];
strcpy (mChars, rhs.mChars); mString = rhs.mString.c_str ();
} // Delete the instance and release allocated storage
~JNIString() { delete [] mChars; } // assign a new value to this instance from the given string
JNIString & operator =(const string& rhs) {
delete [] mChars; int slen = rhs.length ();
jchar* buffer = new jchar[slen];
int len = MultiByteToWideChar (CP_ACP, 0, rhs.c_str (),
rhs.length (), (wchar_t*)buffer, slen); if (len > 0 && len < slen)
buffer[len] = 0; mJstr = mEnv->NewString (buffer, len);
delete [] buffer; mChars = new char[rhs.length () + 1];
strcpy (mChars, rhs.c_str ()); mString = rhs.c_str (); return *this;
} // Supply operator methods for converting the JNIString to a string
// or char*, making it easy to pass JNIString arguments to functions
// that require string or char* parameters.
string & GetString() { return mString; }
operator string() { return mString; }
operator const char* () { return mString.c_str (); }
operator jstring() { return mJstr; }private: JNIEnv* mEnv; // The enviroment pointer for this native method.
jstring mJstr; // A copy of the jstring object that this JNIString represents
char* mChars; // Pointer to a ANSI code page char array
string mString; // string buffer for holding the "value" of this instance (ANSI code page)
};
最好带深度优先访问方法。