Jua*_*cek 4 c++ java java-native-interface
我试图从一个从C++调用的Java方法传回一个字符串.我无法找出我应该调用什么JNI函数来访问该方法并返回一个jstring值.
我的代码如下:
C++部分
main() {
jclass cls;
jmethodID mid;
jstring rv;
/** ... omitted code ... */
cls = env->FindClass("ClassifierWrapper");
mid = env->GetMethodID(cls, "getString","()Ljava/lang/String");
rv = env->CallStatic<TYPE>Method(cls, mid, 0);
const char *strReturn = env->GetStringUTFChars(env, rv, 0);
env->ReleaseStringUTFChars(rv, strReturn);
}
Run Code Online (Sandbox Code Playgroud)
Java代码
public class ClassifierWrapper {
public String getString() { return "TEST";}
}
Run Code Online (Sandbox Code Playgroud)
方法签名(来自"javap -s Class")
public java.lang.String getString();
Signature: ()Ljava/lang/String;
Run Code Online (Sandbox Code Playgroud)
你应该有
cls = env->FindClass("ClassifierWrapper");
Run Code Online (Sandbox Code Playgroud)
然后,您需要调用构造函数来获取新对象:
jmethodID classifierConstructor = env->GetMethodID(cls,"<init>", "()V");
if (classifierConstructor == NULL) {
return NULL; /* exception thrown */
}
jobject classifierObj = env->NewObject( cls, classifierConstructor);
Run Code Online (Sandbox Code Playgroud)
您正在获取静态方法(即使方法名称错误).但是你需要获取实例方法,因为getString()不是静态的.
jmethodID getStringMethod = env->GetMethodID(cls, "getString", "()Ljava/lang/String");
Run Code Online (Sandbox Code Playgroud)
现在调用方法:
rv = env->CallObjectMethod(classifierObj, getStringMethod, 0);
const char *strReturn = env->GetStringUTFChars(env, rv, 0);
Run Code Online (Sandbox Code Playgroud)
完整的工作解决方案如下:
Java端
public class ClassifierWrapper {
public ClassifierWrapper(){}
public String getString() { return "TEST";}
}
Run Code Online (Sandbox Code Playgroud)
本机端
jclass cls;
jmethodID mid;
jstring rv;
cls = jniEnv->FindClass("ClassifierWrapper"); //plase also consider your package name as package\name\classname
jmethodID classifierConstructor = jniEnv->GetMethodID(cls,"<init>", "()V");
if (classifierConstructor == NULL) {
return NULL; /* exception thrown */
}
jobject classifierObj = jniEnv->NewObject( cls, classifierConstructor);
jmethodID getStringMethod = jniEnv->GetMethodID(cls, "getString", "()Ljava/lang/String;");
rv = (jstring)(jniEnv->CallObjectMethod(classifierObj, getStringMethod));
const char *strReturn = jniEnv->GetStringUTFChars( rv, 0);
jniEnv->ReleaseStringUTFChars(rv, strReturn);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12562 次 |
| 最近记录: |