Gau*_*bbi 5 c++ java java-native-interface jnienv
我正面临着使用JNI从C++代码进行java调用的问题.我能够获得jobject,但是jobject上的任何API的调用都会失败.在挖掘将近一天并与其他工作Java API(我在我的代码中调用的jobjects)进行比较时,我发现了一个区别.
以下一段代码
void printClassInfo(JNIEnv* env, jobject object, jclass klazz)
{
printf("printclass info 1\n");
printf("printclass info 2\n");
// First get the class object
jmethodID mid = env->GetMethodID(klazz, "getClass", "()Ljava/lang/Class;");
printf("printclass info 2.1\n");
jobject clsObj = env->CallObjectMethod(object, mid);
printf("printclass info 3\n");
if(clsObj == NULL){
printf("cls obj is null");
}
}
Run Code Online (Sandbox Code Playgroud)
对于我看到问题的作业,print cls obj为null.
对于其他jobjects,调用不返回null.
主要区别在于它是一个新增的类,我似乎错过了可能导致此问题的内容.我一次又一次地重新检查,但没有得到任何明确的指标.
任何帮助赞赏.
Ale*_*ohn 13
你已经拥有了object.为什么你需要上课(对不起klass)?JNI有适合你的功能,GetObjectClass(jobject).这是你可以做的:
void printClassInfo(JNIEnv* env, jobject object) {
jclass clsObj = env->GetObjectClass(env, object);
if (clsObj == NULL) {
printf("cls obj is null");
}
}
Run Code Online (Sandbox Code Playgroud)
这会解决你的问题吗?
我找到了解决方案。这是错误的地方,以防对其他人有帮助
Java API 返回列表,在调用后的 JNI 中,我试图将其视为 jobjectArray,这显然不起作用,因为在 JNI 术语中,它将是一个 jobject,我们必须将其视为一个 jobject(纠正我,如果这是错误的)。我遵循了已经到位的实现,但似乎它们从未经过测试。
真正让我困惑的行为是,它从未抱怨我将其转换为 jobjectarray 时所做的类型转换,甚至让我遍历损坏的 jobjectarray,甚至提取损坏的元素。这花了我一段时间来排除故障。
这一切让我想到,像 Haskell 这样具有强类型推理能力的语言应该更多地用于应用软件。
| 归档时间: |
|
| 查看次数: |
5209 次 |
| 最近记录: |