java 对象赋值给scala_java – 使用JNI将Scala对象返回给C

vm_args.version = JNI_VERSION_1_2;

vm_args.nOptions = 1;

vm_args.options = options;

vm_args.ignoreUnrecognized = JNI_FALSE;

jint rc = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);

delete options;

if (rc != JNI_OK) {

cin.get();

exit(EXIT_FAILURE);

}

cout << "JVM load succeeded: Version ";

jint ver = env->GetVersion();

cout << (((int) ver >> 16) & 0x0f) << "." << ((int)ver & 0x0f) << endl;

jclass thisClass = env->FindClass("Test");

cout << thisClass << endl;

jmethodID constructor = env->GetMethodID(thisClass, "", "()V");

cout << constructor << endl;

jobject testObject = env->NewObject(thisClass, constructor);

jmethodID getExpression = env->GetMethodID(thisClass, "getExpression", "()Lscala/collection/mutable/ArrayOps;");

我正在尝试使用JNI从C调用Scala函数,将Scala对象返回到C,然后(手动)将返回的对象转换为可以传递给本机方法的C对象.

我知道从C通过JNI访问Scala时会有一些小问题,但我很感激有关如何执行此操作的一些指示.

非常感谢.

最佳答案 一般的建议是在尝试处理scala类之前检查生成的字节代码.有时scalac可能会产生非直观繁琐的字节码.例如案例类

case class CaseClass(value: Int)

将被编译为类似的东西(输出由procyon生成)

public class CaseClass {

public static CaseClass apply(int p0) {

return:CaseClass(invokevirtual:CaseClass(CaseClass$::apply, getstatic:CaseClass$(CaseClass$::MODULE$), p0:int))

}

public int value() {

return:int(getfield:int(CaseClass::value, this:CaseClass))

}

// the rest is omitted

}

在这种情况下,为了获得CaseClass值,您必须这样做

jmethodID apply = env->GetStaticMethodID(thisClass, "apply", "(I)LCaseClass;");

jobject object = env->CallStaticObjectMethod(thisClass, apply, 5);

jmethodID getValue = env->GetMethodID(thisClass, "value", "()I");

jint value = env->CallIntMethod(object, getValue);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值