Jni C 与 Java 互调

 

1.头文件

  
  
  
  
  1. #include <jni.h> 
  2. #include "platform/android/jni/JniHelper.h" 
  3. #include <android/log.h> 

2. jstring 与 char * 的转换

  
  
  
  
  1. char* jstringTostring(JNIEnv* env, jstring jstr)   
  2.     {           
  3.         char* rtn = NULL;   
  4.         jclass clsstring = env->FindClass("java/lang/String");   
  5.         jstring strencode = env->NewStringUTF("utf-8");   
  6.         jmethodID mid = env->GetMethodID(clsstring, "getBytes""(Ljava/lang/String;)[B");   
  7.         jbyteArray barr= (jbyteArray)env->CallObjectMethod(jstr, mid, strencode);   
  8.         jsize alen = env->GetArrayLength(barr);   
  9.         jbyte* ba = env->GetByteArrayElements(barr, JNI_FALSE);   
  10.         if (alen > 0)   
  11.         {   
  12.             rtn = (char*)malloc(alen + 1);   
  13.             memcpy(rtn, ba, alen);   
  14.             rtn[alen] = 0;   
  15.         }   
  16.         env->ReleaseByteArrayElements(barr, ba, 0);   
  17.         return rtn;   
  18.     }  

3.1 Java  - 调用- C(C代码)

  
  
  
  
  1. jint Java_com_elextech_ccgoe_GooglePay_nativePayOK(JNIEnv *env, jobject thiz, jint a, jstring b) 
  2.     { 
  3.         CCLOG("********** nativePayOK*******"); 
  4.         Pay_ID = a; 
  5.         if(Pay_ID==0){ 
  6.             CCLOG("Error in pay"); 
  7.             return -1; 
  8.         } 
  9.  
  10.         char * re ; 
  11.         re = jstringTostring(env , b); 
  12.         sprintf(Pay_Check,"%s",re); 
  13.  
  14.         CCLOG("*****Pay_id****%d",Pay_ID); 
  15.         CCLOG("Pay_Check :%s",Pay_Check); 
  16.  
  17.         GameBoard::sharedGameBoard()->paymentAddPoints(Pay_ID,"",Pay_Check); 
  18.          
  19.         return 1; 
  20.     } 

3.2 Java  - 调用- C(java代码)

  
  
  
  
  1. private native int nativePayOK(int a , String b); 
  2.  
  3. public void onSuccessPay_byProductId(Order order) { 
  4.                 int productId = Integer.parseInt(order.getProductId()); 
  5.                 Log.i("jnitest""------nativePayOK---order.getProductId():"+productId); 
  6.                  
  7.                 nativePayOK(productId, order.getOrderId());                  
  8.             } 

4.1  C - 调用- Java (java代码)

  
  
  
  
  1. public static void Click_pay(int pay_id){ 
  2.          Log.i("jnitest""------------goolge pay---pay_id:"+pay_id); 
  3. payItem.setItemType(PayItemData.ITEM_TYPE_INAPP); 
  4.          payItem.setItemId(""+pay_id); 
  5.     GamePayImpl.getInstance().onSubmitPayAction(payItem); 
  6.   

4.2  C - 调用- Java (C代码)

  
  
  
  
  1. #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)  
  2.     JniMethodInfo minfo; 
  3. bool isHave; 
  4. if (gameBoardViewDelegate->if_QQLogin()) 
  5.     CCLOG("qq pay"); 
  6.     isHave = JniHelper::getStaticMethodInfo(minfo,  "com/elextech/goeqq/QQActivity","Click_qq_pay","(I)V"); 
  7. }  
  8. else 
  9.     CCLOG("google pay "); 
  10.     isHave = JniHelper::getStaticMethodInfo(minfo,  "com/elextech/ccgoe/GooglePay","Click_pay","(I)V"); 
  11.       
  12.     jobject jobj; 
  13.     if (!isHave) { 
  14.         CCLOG("jni: no method"); 
  15.     } 
  16.      
  17.     jobj = minfo.env->CallStaticObjectMethod(minfo.classID, minfo.methodID,pay_id); 
  18.  
  19.     CCLOG("jni-java over"); 
  20.  
  21.     #endif 

 4.3 C传jstring给java

  
  
  
  
  1. JniMethodInfo minfo; 
  2. if (! JniHelper::getStaticMethodInfo(minfo, "com/elextech/goelib/GOE""umeng_event""(Ljava/lang/String;)V") ) { 
  3.     CCLOG("jni: no method"); 
  4.     return
  5.  
  6. jstring jevent=minfo.env->NewStringUTF(event);     
  7. minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID, jevent); 
  8. minfo.env->DeleteLocalRef(jevent); 

 5. Java 传byte[]在C中的转换

  
  
  
  
  1. jint Java_com_elextech_goeqq_QQActivity_netiveQQLoginOK(JNIEnv *env, jobject thiz, jstring a, jbyteArray b) 
  
  
  
  
  1. jbyte * olddata = (jbyte*)env->GetByteArrayElements(b, 0);  
  2. jsize  oldsize = env->GetArrayLength(b);  
  3. unsigned char* bytearr = (unsigned char*)olddata;  
  4. int len = (int)oldsize; 

 

 

你可能感兴趣的:(java,android,jni,cocos2dx)