您好,登錄后才能下訂單哦!
首先在Classes文件夾下新建C++文件
InterfaceJNI.cpp
InterfaceJNI.h
InterfaceJNI.h #include <string.h> #include "cocos2d.h" using namespace std; using namespace cocos2d; class InterfaceJNI { public: static void func1(); };
InterfaceJNI.cpp #include "InterfaceJNI.h" #include "platform/android/jni/JniHelper.h" #include <jni.h> #include <android/log.h> // Android那邊的文件的包 #define CLASS_NAME "com/china/jniTest/jniTest" void InterfaceJNI::func1() { JniMethodInfo t; // Class名和方法名的指定。func1是在A(yíng)ndroid代碼那邊定義的方法名。 if (JniHelper::getStaticMethodInfo(t, CLASS_NAME, "func1", "()V")) { // 由于是void、所以使用CallStaticVoidMethod方法。 t.env->CallStaticVoidMethod(t.classID, t.methodID); // 釋放 t.env->DeleteLocalRef(t.classID); } } InterfaceJNI.cpp #include "InterfaceJNI.h" #include "platform/android/jni/JniHelper.h" #include <jni.h> #include <android/log.h> // Android那邊的文件的包 #define CLASS_NAME "com/china/jniTest/jniTest" voidInterfaceJNI::func1() { JniMethodInfo t; // Class名和方法名的指定。func1是在A(yíng)ndroid代碼那邊定義的方法名。 if(JniHelper::getStaticMethodInfo(t, CLASS_NAME, "func1", "()V")) { // 由于是void、所以使用CallStaticVoidMethod方法。 t.env->CallStaticVoidMethod(t.classID, t.methodID); // 釋放 t.env->DeleteLocalRef(t.classID); } }
下面在Cocos2dx中調(diào)用剛才定義好的JNI方法吧。
在HelloWorldScene.cpp中調(diào)用吧。
HelloWorldScene.cpp #include "HelloWorldScene.h" #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) #include "JNICalls/InterfaceJNI.h" #endif USING_NS_CC; bool HelloWorld::init() { ////////////////////////////// // 1. super init first if ( !CCLayer::init() ) { return false; } this->jniLoad(); } void HelloWorld::jniLoad() { // 記得要加上ANDROID的判定。 #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) InterfaceJNI::func1(); #endif }
這樣一來(lái)Cocos2dx方的方法都定義好了。
接下來(lái)該做Android的方法了。
jniTest.java package com.marnishi.jniTest; import org.cocos2dx.lib.Cocos2dxActivity; import android.os.Bundle; public class jniTest extends Cocos2dxActivity{ protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); } public static void func1() { System.out.println("func1 call"); } static { System.loadLibrary("game"); } }
------------------------------------------------------------
----------------------華麗的分割線(xiàn)--------------------------
------------------------------------------------------------
上面只做了個(gè)無(wú)返回值,無(wú)參數(shù)的例子。
下面整幾個(gè)有返回值,有參數(shù)的例子吧。
cocos2d-x InterfaceJNI.h #include <string.h> #include "cocos2d.h" using namespace std; using namespace cocos2d; class InterfaceJNI { public: static void func1(); static void func2(int value); static void func3(bool value); static void func4(const char *value); static void func5(const char *value1, int value2, bool value3); static int func6(); static std::string func7(); };
InterfaceJNI.cpp #include "InterfaceJNI.h" #include "platform/android/jni/JniHelper.h" #include <jni.h> #include <android/log.h> // Android的Package名和java Class名 #define CLASS_NAME "com/china/jniTest/jniTest" void InterfaceJNI::func1() { JniMethodInfo t; // Class名和方法名的指定。 if (JniHelper::getStaticMethodInfo(t, CLASS_NAME, "func1", "()V")) { // 因?yàn)槭莢oid、所以用CallStaticVoidMethod t.env->CallStaticVoidMethod(t.classID, t.methodID); // 釋放 t.env->DeleteLocalRef(t.classID); } } /* // Android代碼這樣寫(xiě)即可 public static void func1() { System.out.println("func1 call"); } */ void InterfaceJNI::func2(int value) { JniMethodInfo t; if (JniHelper::getStaticMethodInfo(t, CLASS_NAME, "func2", "(I)V")) { t.env->CallStaticVoidMethod(t.classID, t.methodID, value); t.env->DeleteLocalRef(t.classID); } } /* public static void func2(int value) { System.out.println("func2 val=" + value); } */ void InterfaceJNI::func3(bool value) { JniMethodInfo t; if (JniHelper::getStaticMethodInfo(t, CLASS_NAME, "func3", "(Z)V")) { t.env->CallStaticVoidMethod(t.classID, t.methodID, value); t.env->DeleteLocalRef(t.classID); } } /* public static void func3(boolean value) { System.out.println("func3 val=" + value); } */ void InterfaceJNI::func4(const char *value) { JniMethodInfo t; if (JniHelper::getStaticMethodInfo(t, CLASS_NAME, "func4", "(Ljava/lang/String;)V")) { jstring stringArg1 = t.env->NewStringUTF(value); t.env->CallStaticVoidMethod(t.classID, t.methodID, stringArg1); t.env->DeleteLocalRef(stringArg1); t.env->DeleteLocalRef(t.classID); } } /* public static void func4(String value) { System.out.println("func4 val=" + value); } */ void InterfaceJNI::func5(const char *value1, int value2, bool value3) { JniMethodInfo t; if (JniHelper::getStaticMethodInfo(t, CLASS_NAME, "func5", "(Ljava/lang/String;IZ)V")) { jstring stringArg1 = t.env->NewStringUTF(value1); t.env->CallStaticVoidMethod(t.classID, t.methodID, stringArg1, value2, value3); t.env->DeleteLocalRef(stringArg1); t.env->DeleteLocalRef(t.classID); } } /* public static void func5(String value1, int value2, boolean value3) { System.out.println("func5 val=" + value1 + " int=" + value2 + " bool=" + value3); } */ int InterfaceJNI::func6() { int ret = 0; JniMethodInfo t; if (JniHelper::getStaticMethodInfo(t, CLASS_NAME, "func6", "()I")) { ret = t.env->CallStaticIntMethod(t.classID, t.methodID); t.env->DeleteLocalRef(t.classID); } return ret; } /* public static int func6() { return 12345; } */ std::string InterfaceJNI::func7() { std::string ret; JniMethodInfo t; if (JniHelper::getStaticMethodInfo(t, CLASS_NAME, "func7", "()Ljava/lang/String;")) { jstring jStr = (jstring)t.env->CallStaticObjectMethod(t.classID, t.methodID); const char* str = t.env->GetStringUTFChars(jStr, NULL); ret = str; t.env->ReleaseStringUTFChars(jStr,str); t.env->DeleteLocalRef(t.classID); } return ret; } /* public static String func7() { return "禁止擼管"; } */ 完事兒
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。