在前一个模版代码(手动创建Andoird项目)的基础上添加C++代码。
关于Android怎么通过jni调用c、c++,网上有一堆解释。
在jni目录创建一个Hello.cpp文件,并定义一个简单的函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#include <stdlib.h> #include <jni.h> #include <android/log.h> #define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "NDKApp", __VA_ARGS__)) extern "C" { JNIEXPORT void JNICALL Java_com_topspeedsnail_game_MainActivity_printHello( JNIEnv* env, jobject obj ) { LOGI( "Hello Android NDK!" ); } } |
修改MainActivity.java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
package com.topspeedsnail.game; import android.app.Activity; import android.os.Bundle; public class MainActivity extends Activity { static { System.loadLibrary( "HelloLib" ); } @Override protected void onCreate( Bundle bundle ) { super.onCreate(bundle); printHello(); } public static native void printHello(); }; |
现在我们来编译C/C++代码;ndk-build会根据jni中的两个文件 Application.mk、Android.mk 进行编译,这两个文件中写了一些编译规则。
jni/Android.mk 指定要编译的c/cpp文件和选项:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
TARGET_PLATFORM := android-23 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := HelloLib LOCAL_SRC_FILES += Hello.cpp LOCAL_ARM_MODE := arm COMMON_CFLAGS := -Werror -DANDROID -DDISABLE_IMPORTGL ifeq ($(TARGET_ARCH),x86) LOCAL_CFLAGS := $(COMMON_CFLAGS) else LOCAL_CFLAGS := -mfpu=vfp -mfloat-abi=hard -mhard-float -fno-short-enums -D_NDK_MATH_NO_SOFTFP=1 $(COMMON_CFLAGS) endif LOCAL_LDLIBS := -llog -lGLESv2 -Wl,-s LOCAL_CPPFLAGS += -std=gnu++11 include $(BUILD_SHARED_LIBRARY) |
jni/Application.mk:平台信息:
1 2 3 4 5 6 7 8 9 |
APP_OPTIM := release APP_PLATFORM := android-19 APP_STL := gnustl_static APP_CPPFLAGS += -frtti APP_CPPFLAGS += -fexceptions APP_CPPFLAGS += -DANDROID APP_ABI := armeabi-v7a-hard APP_MODULES := HelloLib NDK_TOOLCHAIN_VERSION := clang |
参考自cocos2d-x和其他游戏引擎
编译;进入项目目录执行:
1 2 |
$ ndk-build clean $ ndk-build |
使用ant构建项目:
1 |
$ ant debug |
安装到手机:
1 |
$ adb install -r bin/ndkGame-debug.apk |
运行ndkGmae,查看Android系统日志:
1 |
$ adb logcat |
如果你使用Gradle构建,你需要在build.gradle文件中添加一行(sourceSets->main):
1 |
jniLibs.srcDirs = ['libs'] |
1 |
$ gradle build |
源码:https://github.com/tiancode/somecode/tree/master/ndkGame1