[Google Android] 理解NDK(1)-- 编译Android .so文件
2011-12-30 15:55
721 查看
/** 转载必须标明出处*/
说白了就是c代码做成动态库,被java代码调用(JNI)。用C写不出可以直接在Android上跑的可执行程序来。
NDK开发需要一个交叉编译环境,需要安装Cygwin, NDK。
这些准备工作就不说了网上很多,当然也可以问我。
讲一下.so文件的生成
--------------------------------------------------------------------------------------------------------------------------------------------------
编译Android.so文件
1. 定义native接口
创建一个Android的项目 “ndk_plus”,添加一个JNI类。
图1:Android的SDK项目
// JNI.java Code:
2. 根据JNI.java文件生成相应的.h文件
cmd到ndk_plus项目的bin目录,然后执行 javah –classpath . –jni kun.ndk.plus.JNI
这样就会生成kun_ndk_plus_JNI.h头文件。内容如下:
代码
复制代码
如果提示没有javah命令,则需要找到javah.exe所在目录(C:\ProgramFiles\Java\jdk1.5.0\bin),并把这个目录添加到环境变量 PATH里。
3. 根据.h文件实现相应的.c文件
在Eclipse(其它编辑工具均可)里创建kun_ndk_plus_JNI.c文件
//-------------------------------------------------------------------------------------------------------------
#include<jni.h>
#include"kun_ndk_plus_JNI.h"
JNIEXPORT jintJNICALL Java_kun_ndk_plus_JNI_plus
(JNIEnv *e, jobject j, jint a,jint b)
{
return a + b;
}
//-------------------------------------------------------------------------------------------------------------
注意红色部分。由于生成的.h中的函数声明并没有形参,实现时需要自己添加形参变量。
还要注意的是要在蓝色的大括号后面添加一个回车(gcc 编译器的特点)。
4. 制作.mk文件
在NDK目录下的apps目录下新建plus文件夹,在这个文件夹下创建一个txt文件,
输入一下内容:
APP_PROJECT_PATH:= $(call my-dir)
APP_MODULES :=plus
并重命名为Application.mk
在NDK/sources/samples目录下新建plus文件夹, 在这个文件夹下创建一个txt文件,输入以下内容:
LOCAL_PATH :=$(call my-dir)
include$(CLEAR_VARS)
LOCAL_MODULE :=plus
LOCAL_SRC_FILES:= kun_ndk_plus_JNI.c
include$(BUILD_SHARED_LIBRARY)
并重名名为Android.mk。把.c和.h文件拷贝到这个文件夹下。
//关键字具体含义看doc/ OVERVIEW.TXT
5. 编译
启动Cygwin, cd到NDK目录
make APP=plus
成功后会在apps/plus/libs/armeabi下有一个libplus.so文件。
6. 后面就是把.so文件加到Android工程中在java代码中使用了。
说白了就是c代码做成动态库,被java代码调用(JNI)。用C写不出可以直接在Android上跑的可执行程序来。
NDK开发需要一个交叉编译环境,需要安装Cygwin, NDK。
这些准备工作就不说了网上很多,当然也可以问我。
讲一下.so文件的生成
--------------------------------------------------------------------------------------------------------------------------------------------------
编译Android.so文件
1. 定义native接口
创建一个Android的项目 “ndk_plus”,添加一个JNI类。
图1:Android的SDK项目
// JNI.java Code:
package kun.ndk.plus; public class JNI { public native int plus(int a, int b); }
2. 根据JNI.java文件生成相应的.h文件
cmd到ndk_plus项目的bin目录,然后执行 javah –classpath . –jni kun.ndk.plus.JNI
这样就会生成kun_ndk_plus_JNI.h头文件。内容如下:
代码
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class kun_ndk_plus_JNI */ #ifndef _Included_kun_ndk_plus_JNI #define _Included_kun_ndk_plus_JNI #ifdef __cplusplus extern "C" { #endif /* * Class: kun_ndk_plus_JNI * Method: plus * Signature: (II)I */ JNIEXPORT jint JNICALL Java_kun_ndk_plus_JNI_plus (JNIEnv *, jobject, jint, jint); #ifdef __cplusplus } #endif #endif
复制代码
如果提示没有javah命令,则需要找到javah.exe所在目录(C:\ProgramFiles\Java\jdk1.5.0\bin),并把这个目录添加到环境变量 PATH里。
3. 根据.h文件实现相应的.c文件
在Eclipse(其它编辑工具均可)里创建kun_ndk_plus_JNI.c文件
//-------------------------------------------------------------------------------------------------------------
#include<jni.h>
#include"kun_ndk_plus_JNI.h"
JNIEXPORT jintJNICALL Java_kun_ndk_plus_JNI_plus
(JNIEnv *e, jobject j, jint a,jint b)
{
return a + b;
}
//-------------------------------------------------------------------------------------------------------------
注意红色部分。由于生成的.h中的函数声明并没有形参,实现时需要自己添加形参变量。
还要注意的是要在蓝色的大括号后面添加一个回车(gcc 编译器的特点)。
4. 制作.mk文件
在NDK目录下的apps目录下新建plus文件夹,在这个文件夹下创建一个txt文件,
输入一下内容:
APP_PROJECT_PATH:= $(call my-dir)
APP_MODULES :=plus
并重命名为Application.mk
在NDK/sources/samples目录下新建plus文件夹, 在这个文件夹下创建一个txt文件,输入以下内容:
LOCAL_PATH :=$(call my-dir)
include$(CLEAR_VARS)
LOCAL_MODULE :=plus
LOCAL_SRC_FILES:= kun_ndk_plus_JNI.c
include$(BUILD_SHARED_LIBRARY)
并重名名为Android.mk。把.c和.h文件拷贝到这个文件夹下。
//关键字具体含义看doc/ OVERVIEW.TXT
5. 编译
启动Cygwin, cd到NDK目录
make APP=plus
成功后会在apps/plus/libs/armeabi下有一个libplus.so文件。
6. 后面就是把.so文件加到Android工程中在java代码中使用了。
相关文章推荐
- [Google Android] 理解NDK(1)-- 编译Android .so文件
- Android--ndk编译生成.so文件
- Android studio NDK-JNI 编译so文件
- as编译so文件:'command 'D:\ndk\android-ndk-r10c\ndk-build.cmd'' finished with non-zero exit value 2
- Jni中执行ndk-build,编译第三方静态库(.a)和动态库(.so)的Android.mk文件写法
- Android studio NDK-JNI 编译so文件
- Eclipse android项目中配置NDK自动编译生成so文件
- android(NDK+JNI)---NDK编译生成so文件
- Android studio NDK 配置编译本地库(so文件)
- android studio 编译NDK android studio 生成.so文件
- android studio ndk-build 编译C生成.so文件(ndk基础篇)
- android(NDK+JNI)---在Eclipse中编译NDK的so文件
- Android studio NDK编译C代码so文件
- window下用android-ndk-r9d编译.so文件之mutex in namespace 'std' does not name a type
- android NDK编译多个so文件
- android项目中配置NDK自动编译生成so文件
- Android NDK将C++/C编译成so文件
- Android开发中如何将自己编译的.so文件用到其他的项目中
- Android Studio NDK 开发与调试(生成 .so 文件)
- Xamarin.Android编译提示找不到mscorlib.dll.so文件