JNI的数字和数字字符串类型要明确区分。

        当你在C#中调用JNI的方法时,会存在Invalid indirect reference 0x5a02d6e0 in decodeIndirectRef错误。例如:testdemo.cpp文件中的类型为char* requestId ,在调用CallStaticVoidMethod方法时,就存在了这种错误。为什么?问题是requestId传递的是数字型的字符串,你需要NewStringUTF转换string类型。否则编译时会将你的字符串的数字型看成是引用类型,事实上,我们这里是需要一个简单字符串的数字,所以要将数字转换成字符串形式传输给java层。

C#层:

test.cpp

void FlyfotMembership_createFriendshipRequest(char* requestId,char* Yodo1SetCallbackGameObj,char* Yodo1SetCallbackMethodName,char* Yodo1SetCallbackContextParams){
LOGI("createFriendshipRequest");
jclass cls = getUnitySupportMms();
if(cls != NULL){
jmethodID id = jni_env->GetStaticMethodID(cls,cn_UnitySupportMms_createFriendshipRequest,cn_UnitySupportSns_createFriendshipRequest_params);
if(id!=NULL){
LOGI("createFriendshipRequest methodID=%d",id);
jni_env->CallStaticVoidMethod(cls,id,

requestId,
jni_env->NewStringUTF(Yodo1SetCallbackGameObj),
jni_env->NewStringUTF(Yodo1SetCallbackMethodName),
jni_env->NewStringUTF(Yodo1SetCallbackContextParams));
}
}

  }

错误log如下:

05-24 14:53:12.108: I/yodo1jni(4460): createFriendshipRequest
05-24 14:53:12.108: D/dalvikvm(4460): Trying to load lib /data/app-lib/com.yodo1.sdk.unity.sampleapp-1/libyodo1_sdk.so 0x41237360
05-24 14:53:12.108: D/dalvikvm(4460): Shared lib '/data/app-lib/com.yodo1.sdk.unity.sampleapp-1/libyodo1_sdk.so' already loaded in same CL 0x41237360
05-24 14:53:12.108: I/yodo1jni(4460): requestUserInfoById methodID=1458096800
05-24 14:53:12.108: W/dalvikvm(4460): Invalid indirect reference 0x5a02d6e0 in decodeIndirectRef
05-24 14:53:12.108: E/dalvikvm(4460): VM aborting
05-24 14:53:12.108: A/libc(4460): Fatal signal 11 (SIGSEGV) at 0xdeadd00d (code=1), thread 4473 (UnityMain)
05-24 14:53:12.158: D/dalvikvm(3538): GC_CONCURRENT freed 502K, 13% free 4261K/4864K, paused 2ms+2ms, total 24ms
05-24 14:53:12.218: I/DEBUG(124): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
05-24 14:53:12.218: I/DEBUG(124): Build fingerprint: 'asus/CN_epad/TF300T:4.2.1/JOP40D/CN_epad-10.6.1.8.1-20130306:user/release-keys'
05-24 14:53:12.218: I/DEBUG(124): Revision: '0'
05-24 14:53:12.218: I/DEBUG(124): pid: 4460, tid: 4473, name: UnityMain  >>> com.yodo1.sdk.unity.sampleapp <<<
05-24 14:53:12.218: I/DEBUG(124): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadd00d
05-24 14:53:12.298: I/DEBUG(124):     r0 00000000  r1 00000000  r2 deadd00d  r3 00000000
05-24 14:53:12.298: I/DEBUG(124):     r4 408771b0  r5 0000020c  r6 5a02d6e0  r7 5f0331b8
05-24 14:53:12.298: I/DEBUG(124):     r8 513f4ef0  r9 5e33c7cd  sl 5f033180  fp 00000001
05-24 14:53:12.298: I/DEBUG(124):     ip 00004000  sp 5f032f18  lr 40091359  pc 4080ed08  cpsr 60000030
05-24 14:53:12.298: I/DEBUG(124):     d0  0000000042960000  d1  0000000000000000


java层:

public static void createFriendshipRequest(String requestId, String callbackGameObj,
String callbackMethodName, String callbackContextParams) {
//todo.....
};


方案:

void FlyfotMembership_createFriendshipRequest(char* requestId,char* Yodo1SetCallbackGameObj,char* Yodo1SetCallbackMethodName,char*Yodo1SetCallbackContextParams){
LOGI("createFriendshipRequest");
jclass cls = getUnitySupportMms();
if(cls != NULL){
jmethodID id = jni_env->GetStaticMethodID(cls,cn_UnitySupportMms_createFriendshipRequest,cn_UnitySupportSns_createFriendshipRequest_params);
if(id!=NULL){
LOGI("createFriendshipRequest methodID=%d",id);
jni_env->CallStaticVoidMethod(cls,id,
jni_env->NewStringUTF(requestId),
jni_env->NewStringUTF(Yodo1SetCallbackGameObj),
jni_env->NewStringUTF(Yodo1SetCallbackMethodName),
jni_env->NewStringUTF(Yodo1SetCallbackContextParams));
}
}
}






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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值