Android NDK开发入门

编写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中添加
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)


5.在jni目录下使用idk-build编译c代码
localhost:jni yuiaragaki$ /Users/yuiaragaki/Documents/Android/sdk/ndk-bundle/ndk-build 
编译成功后会在libs 目录下生成libhello.so
6.在java代码中加载so文件即可
static {
    System.loadLibrary("hello");
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值