ndk-build + Android.mk + Application.mk编译JNI,及JNI HelloWorld篇

Android导入第三方静态库.a,编译成动态库.so。

> NDK编译SO库
eclipse中android NDK开发环境的搭建及编译SO库 - http://blog.csdn.net/wangzhen209/article/details/50312633
Eclipse下用NDK编译生成so文件- http://blog.csdn.net/devilnov/article/details/41543975
在Eclipse+SDK IDE中,配置Window-->Preferences-->Android-->NDK,在NDK Location中输入之前android-ndk-r10d的全路径
AndroidStudio 编译C/C++文件生成SO文件- http://blog.csdn.net/krubo1/article/details/50547681
Android NDK 生成、调用so文件- http://blog.csdn.net/pomme_qixiaohu/article/details/8597993
AndroidStudio 编译C/C++文件生成SO文件- http://blog.csdn.net/krubo1/article/details/50547681
NDK开发- http://blog.csdn.net/a396901990/article/category/6305704
Android之NDK开发:http://www.cnblogs.com/devinzhang/archive/2012/02/29/2373729.html

> NDK环境的配置.
Eclipse中配置NDK R10环境- http://blog.csdn.net/mole/article/details/42520185
AndroidStudio如何配置NDK/JNI开发环境-http://blog.csdn.net/aplixy/article/details/51429305
Android Studio NDK开发环境搭建-http://jingyan.baidu.com/article/456c463b4a52460a58314402.html

添加环境变量NDK_ROOT 为:D:\Android\android-ndk-r10d
在环境变量 PATH 下追加 :%NDK_ROOT%;
然后在CMD窗口中输入ndk-build  -version,检测是否安装成功
 NDK执行命令:
    D:\> cd D:\ide\android-ndk-r10b\samples\hello-jni\jni
    D:\ide\android-ndk-r10b\samples\hello-jni\jni>ndk-build

> 编写JNI HelloWord例子,在D盘下建了个Android工程,及编译SO
JNI入门教程之HelloWorld篇- http://blog.csdn.net/mingjava/article/details/180946
一步一步学习androidNDK编程(hello world)- http://blog.csdn.net/mockingbirds/article/details/45132551
   下面开始编写HelloWorld程序,由于涉及到要编写c/c++代码因此我们会在开发中使用Microsoft VC++或Eclipse工具:
1. 我们在硬盘上建立一个UninstallNative目录作为我们的工作目录,首先我们需要编写自己的java代码,在java代码中我们会声明native方法,代码非常简单。如下所示:
    在Android工程中编写UninstallNative.java文件
package com.desaco.uninstallfeedback.native_method;
public class UninstallNative {
    //com.desaco.uninstallfeedback.native_method.UninstallNative
    static {
        System.loadLibrary("uninstall_app_feedback");
    }
    public native String userFeedback();
}
  注意我们的userFeedback()方法的声明,它有一个关键字native,表明这个方法使用java以外的语言实现。方法不包括实现,因为我们要用c/c++语言实现它。注意System.loadLibrary("uninstall_app_feedback")这句代码,它是在静态初始化块中定义的,系统用来装载hello共享库,这就是我们在后面生成的uninstall_app_feedback.dll(如果在其他的操作系统可能是其他的形式,比如uninstall_app_feedback.so)

2.切换到 D:\workpalce_fun\UninstallFeedback\src\com\desaco\uninstallfeedback\native_method目录下,打开cmd窗口(已经配置好了JDK环境),生成class文件:
   生成class文件命令: javac UninstallNative.java  生成UninstallNative.class文件

3.JDK自带了javah命令可以实现,也可以用eclipse中ant 脚本去生成一个.h的头文件,假设工程目录下有bin文件夹,bin存放编译好的class文件,生成JNI .h头文件
  Android工程目录D:\workpalce_fun\UninstallFeedback\bin\classes;生成.h文件命令: D:\workpalce_fun\UninstallFeedback\bin\classes>
javah -jni com.desaco.uninstallfeedback.native_method.UninstallNative
注意:com.desaco.uninstallfeedback.native_method是包名,UninstallNative是类名. 
  com_desaco_uninstallfeedback_native_method_UninstallNative.h文件如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_desaco_uninstallfeedback_native_method_UninstallNative */
#ifndef _Included_com_desaco_uninstallfeedback_native_method_UninstallNative
#define _Included_com_desaco_uninstallfeedback_native_method_UninstallNative
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_desaco_uninstallfeedback_native_method_UninstallNative
 * Method:    displayHelloWorld
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_desaco_uninstallfeedback_native_1method_UninstallNative_displayHelloWorld
  (JNIEnv *, jobject);

/*
 * Class:     com_desaco_uninstallfeedback_native_method_UninstallNative
 * Method:    userFeedback
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_desaco_uninstallfeedback_native_1method_UninstallNative_userFeedback
  (JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif

    JNI是一门复杂,有趣且富有挑战性的技术,以后将说明如何在java语言和Native语言之间进行交互。
4.接下在src目录下编辑所需要到的my_function.c文件  
#include <jni.h>
#include <stdio.h>
#include "com_desaco_uninstallfeedback_native_method_UninstallNative.h"
JNIEXPORT void JNICALL Java_com_desaco_uninstallfeedback_native_1method_UninstallNative_displayHelloWorld
  (JNIEnv *env, jobject obj)
{
  printf("HelloWorld JNI!\n");
  return;
}
JNIEXPORT void JNICALL Java_com_desaco_uninstallfeedback_native_1method_UninstallNative_userFeedback
  (JNIEnv *env, jobject obj){

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
这些都是 Android NDK 内部的 `Android.mk` 文件。其中,`./android-ndk-r25c/sources/android/native_app_glue/Android.mk` 是用于编译 Native Activity 示例应用程序的 `Android.mk` 文件;`./android-ndk-r25c/sources/android/support/Android.mk` 是包含一些 Android 支持库的 `Android.mk` 文件;`./android-ndk-r25c/sources/android/ndk_helper/Android.mk` 是包含一些辅助函数和类的 `Android.mk` 文件;`./android-ndk-r25c/sources/android/cpufeatures/Android.mk` 是用于编译 `cpufeatures` 库的 `Android.mk` 文件,该库提供了一些 CPU 相关的信息和功能;`./android-ndk-r25c/sources/cxx-stl/llvm-libc++abi/Android.mk` 和 `./android-ndk-r25c/sources/cxx-stl/llvm-libc++/Android.mk` 是用于编译 C++ STL 库的 `Android.mk` 文件,分别对应 libc++abi 和 libc++ 两个 STL 库;`./android-ndk-r25c/sources/third_party/googletest/Android.mk` 是用于编译 Google Test 测试框架的 `Android.mk` 文件;`./android-ndk-r25c/sources/third_party/shaderc/Android.mk` 是用于编译 Shaderc 编译器的 `Android.mk` 文件,该编译器可以将 GLSL 代码编译成 SPIR-V 代码;`./android-ndk-r25c/sources/third_party/shaderc/libshaderc/Android.mk` 是用于编译 Shaderc 库的 `Android.mk` 文件;`./android-ndk-r25c/sources/third_party/shaderc/libshaderc_util/Android.mk` 是用于编译 Shaderc Util 库的 `Android.mk` 文件,该库提供了一些辅助函数和类;`./android-ndk-r25c/sources/third_party/shaderc/third_party/Android.mk` 是用于编译 Shaderc 编译器依赖的第三方库的 `Android.mk` 文件,包括 glslang 和 spirv-tools 两个库;`./android-ndk-r25c/sources/third_party/shaderc/third_party/glslang/Android.mk` 是用于编译 glslang 库的 `Android.mk` 文件;`./android-ndk-r25c/sources/third_party/shaderc/third_party/spirv-tools/Android.mk` 是用于编译 spirv-tools 库的 `Android.mk` 文件;`./android-ndk-r25c/sources/third_party/vulkan/src/build-android/jni/Android.mk` 是用于编译 Vulkan 库的 `Android.mk` 文件。 如果您要在 Android NDK 中编写自己的 `Android.mk` 文件,可以参考这些示例文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值