编写NDK的一般步骤:
1.android studio会自动在打包编译的时候去生成so文件的,但是我在使用c代码测试的时候遇到自动编译出错
Error: Your project contains C++ files but it is not using a supported native build system.
Consider using CMake or idk-build…….所以我建议还是手动去生成so文件,这时需要让as不自动编译so文件,需要在app module的build.gradle中添加
Consider using CMake or idk-build…….所以我建议还是手动去生成so文件,这时需要让as不自动编译so文件,需要在app module的build.gradle中添加
jni.srcDirs = []
,同时在gradle.properties添加
Android.useDeprecatedNdk=true
2.定义Native方法
在MainActivity下创建sayHello方法
public native String sayHello();
可以新建一个类用来保存相关的Native方法,如HelloJni.java
3.新建jni文件夹,用于存放c文件以及头文件和 .mk文件
在jni目录下创建c文件hello.c
#include <string.h> #include <jni.h> //jstring:返回值类型 //Java_所要实现的方法名所在java类用下划线替代点的引用地址_方法名(JNI环境变量 env,JNI环境对象 jobj) //yuiaragaki.microfun.com.dsaa jstring Java_yuiaragaki_microfun_com_dsaa_MainActivity_sayHello(JNIEnv *env, jobject thiz) { return (*env)->NewStringUTF(env, "Hello from JNI!"); }
由于手工定义c函数很容易出错,可以借助javah来完成(还没弄明白,之后加上)
4.在jni目录下创建Android.mk文件
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := hello //ndk编译完之后的so名字 libhello.so LOCAL_SRC_FILES := hello.c //指定编译的文件,不需要指定.h源文件,ndk会自动加载 include $(BUILD_SHARED_LIBRARY)在注释的地方改成自己要编译的文件即可,多个文件写法参照下面
MY_SRC_FILES := $(wildcard $(LOCAL_PATH)/../../../../../Classes/Common/*.cpp) MY_SRC_FILES += $(wildcard $(LOCAL_PATH)/../../../../../Classes/GamePlay/*.cpp) MY_SRC_FILES += $(wildcard $(LOCAL_PATH)/../../../../../Classes/GridAnimationEditor/*.cpp) MY_SRC_FILES += $(wildcard $(LOCAL_PATH)/../../../../../Classes/Model/*.cpp) MY_SRC_FILES += $(wildcard $(LOCAL_PATH)/../../../../../Classes/UI/*.cpp) MY_SRC_FILES += $(wildcard $(LOCAL_PATH)/../../../../../Classes/jansson/*.c) MY_SRC_FILES += $(wildcard $(LOCAL_PATH)/../../../../../Classes/Engine/*.cpp) MY_SRC_FILES += $(wildcard $(LOCAL_PATH)/../../../../../Classes/Engine/Algorithm/*.cpp) MY_SRC_FILES += $(wildcard $(LOCAL_PATH)/../../../../../Classes/Engine/Crash/*.cpp) MY_SRC_FILES += $(wildcard $(LOCAL_PATH)/../../../../../Classes/Engine/Effect/*.cpp) MY_SRC_FILES += $(wildcard $(LOCAL_PATH)/../../../../../Classes/Engine/Network/*.cpp) MY_SRC_FILES += $(wildcard $(LOCAL_PATH)/../../../../../Classes/Engine/Resource/*.cpp) MY_SRC_FILES += $(wildcard $(LOCAL_PATH)/../../../../../Classes/Engine/Social/*.cpp) MY_SRC_FILES += $(wildcard $(LOCAL_PATH)/../../../../../Classes/Engine/Common/*.cpp) MY_SRC_FILES += $(wildcard $(LOCAL_PATH)/../../../../../Classes/Engine/Display/*.cpp) MY_SRC_FILES += $(wildcard $(LOCAL_PATH)/../../../../../Classes/Engine/IOS/*.cpp) MY_SRC_FILES += $(wildcard $(LOCAL_PATH)/../../../../../Classes/Engine/Platform/*.cpp) MY_SRC_FILES += $(wildcard $(LOCAL_PATH)/../../../../../Classes/Engine/Shader/*.cpp) MY_SRC_FILES += $(wildcard $(LOCAL_PATH)/../../../../../Classes/Engine/UI/*.cpp) MY_SRC_FILES += $(wildcard $(LOCAL_PATH)/../../../../../Classes/Engine/Data/*.cpp) MY_SRC_FILES += $(wildcard $(LOCAL_PATH)/../../../../../Classes/Map/*.cpp) MY_SRC_FILES += $(wildcard $(LOCAL_PATH)/../../../../../Classes/Scene/*.cpp) MY_SRC_FILES += $(wildcard $(LOCAL_PATH)/../../../../../Classes/UnitTest/*.cpp) MY_SRC_FILES := $(MY_SRC_FILES:$(LOCAL_PATH)/%=%) LOCAL_SRC_FILES := main.cpp \ ../../../../../Classes/AppDelegate.cpp LOCAL_SRC_FILES += $(MY_SRC_FILES)
localhost:jni yuiaragaki$ /Users/yuiaragaki/Documents/Android/sdk/ndk-bundle/ndk-build
编译成功后会在libs 目录下生成libhello.so
6.在java代码中加载so文件即可
static { System.loadLibrary("hello"); }