NDK之HelloWord!

使用工具:Android Studio 2.2.2

1. 配置local.properties添加NDK路径。

  

效果:当然,你也可以手输写进去。

2. 项目gradle.properties追加

android.useDeprecatedNdk=true

3. 创建jni文件夹

效果:

OK,开始写代码咯

4. 编写Java层引用native的代码

5. 生成与之对应的.h头文件

5.1 进入java的文件夹下

5.2 javah命令生成.h文件,记得带上完整的包名。

5.3 将.h文件剪切到jni文件夹下

5.4 编写与之对应的C文件

#include <jni.h>
#include <com_example_lanhe_android_jnistringdemo_jni_HelloWorld.h>

JNIEXPORT jstring JNICALL Java_com_example_lanhe_1android_jnistringdemo_jni_HelloWorld_getHelloWorld
  (JNIEnv *env, jobject thiz){

   return (*env)->NewStringUTF(env, "Hello Jni");
}

5.5 cpp文件夹下添加Android.mk 文件

Android.mk: 直接复制,再此基础上改就好了。

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := HelloWorldLib
LOCAL_SRC_FILES := com_example_lanhe_android_jnistringdemo_jni_HelloWorld.c

include $(BUILD_SHARED_LIBRARY)

6. build.gradle 配置ndk

ndk {
//这里的模块名称要对应之前的名称 moduleName "HelloWorldLib" //生成对应硬件平台的so abiFilters "armeabi","arm64-v8a","armeabi-v7a", "x86" }

7.测试使用

效果:

题外话:

1.发生了如下错误:

http://tools.android.com/tech-docs/new-build-system/gradle-experimental.Error:Execution failed for task ':app:compileDebugNdk'.
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'D:AndroidDevelopmentToolsandroid-ndk-r10b dk-build.cmd'' finished with non-zero exit value 2

解决方法:在cpp文件夹下追加一个empty.c

2.发生了如下错误:

Error:Execution failed for task ':app:compileDebugNdk'.
> com.android.ide.common.process.ProcessException: Error while executing 'D:AndroidDevelopmentToolsandroid-ndk-r10b dk-build.cmd' with arguments {NDK_PROJECT_PATH=null APP_BUILD_SCRIPT=D:workspaceworkspace_AndroidStudioJNIHelloWorldDemoappuildintermediates dkdebugAndroid.mk APP_PLATFORM=android-24 NDK_OUT=D:workspaceworkspace_AndroidStudioJNIHelloWorldDemoappuildintermediates dkdebugobj NDK_LIBS_OUT=D:workspaceworkspace_AndroidStudioJNIHelloWorldDemoappuildintermediates dkdebuglib APP_ABI=armeabi-v7a,armeabi,arm64-v8a,x86}

解决方法:把项目的build.gradle的版本改低一点。(不怎么推荐)

3.错误描述如下:

Error:(7, 3) opening dependency file D:workspaceworkspace_AndroidStudioJNIHelloWorldDemoappuildintermediates dkdebugobj/local/armeabi-v7a/objs/hello/D_workspaceworkspace_AndroidStudioJNIHelloWorldDemoappsrcmainjnicom_example_lanhe_android_jnihelloworlddemo_helloworld_HelloWorld.o.d: No such file or directory

解决办法:.h的文件名称太长了,把它放到外层目录,剪短它的长度。重新设置.h文件。

原来是工程结构的目录太深,android stuido 无法找到并创建so 文件build时的临时目录。只要将工程目录深度减少一 两级时就可以正常编译。

参考资料:

http://blog.csdn.net/qq_30379689/article/details/52590189

http://www.aichengxu.com/view/79290

原文地址:https://www.cnblogs.com/H-BolinBlog/p/6096589.html