一个独立的应用,如果涉及到jni,动态库so 就要自己开发。
Android 提供了ndk 开发so库。
这里提示下,如果使用gcc编译生成的so 是不能使用在android的,需要ndk再次转换下才可以使用。
下面通过一个示例来说明ndk生成so的方法,和配合jni的使用。
1、 下载ndk,目前最新版本是 android-ndk-r9d
http://developer.android.com/sdk/ndk/index.html
2、 下载并安装 cygwin,如果是linux系统,请忽略此步骤。
3、 打开Eclipse,新建一个Android工程(我的取名为TestNdk)
4、 创建SumJni.java
publicclass SumJni {
public static native int nativeGetSum(intdata1,int data2);
}
5、生成 JNI 头文件
下面生成JNI 头文件啦,使用 javah 命令,对 SumJni.java 这个文件生成,别搞错啦!
使用命令行 进入 android 项目的 bin 目录中,然后执行 javah -classpath ./classes -jni com.example.testndk.SumJni 这个命令。别忘记包名!
生成com_example_testndk_SumJni.h
#include <jni.h>
/* Header for classcom_example_testndk_SumJni */
#ifndef_Included_com_example_testndk_SumJni
#define_Included_com_example_testndk_SumJni
#ifdef __cplusplus
extern "C" {
#endif
/*
*Class: com_example_testndk_SumJni
*Method: nativeGetSum
*Signature: (II)I
*/
JNIEXPORT jint JNICALLJava_com_example_testndk_SumJni_nativeGetSum
(JNIEnv *, jclass, jint, jint);
#ifdef __cplusplus
}
#endif
#endif
6、书写C 代码,com_example_testndk_SumJni.cpp
#include"com_example_testndk_SumJni.h"
JNIEXPORT jint JNICALLJava_com_example_testndk_SumJni_nativeGetSum
(JNIEnv *, jclass, jint data1, jint data2)
{
return (data1+data2);
}
7、Android.Mk
LOCAL_PATH :=$(call my-dir)
include$(CLEAR_VARS)
LOCAL_MODULE := libtestndk
LOCAL_SRC_FILES:= com_example_testndk_SumJni.cpp
include$(BUILD_SHARED_LIBRARY)
8,编译SO 文件
在NDK的主目录 android-ndk-r9d 下面有个 sources 文件夹中创建一个名为 TestNdk的文件夹
我这里需要在 TestNdk文件夹下面再创建一个名为 jni 的文件夹,文件夹中有如下三个文件
Android.mk
com_example_testndk_SumJni.cpp
com_example_testndk_SumJni.h
命令行当前路径在TestNdk/jni
输入命令:ndk/android-ndk-r9d/ndk-build
注:就是运行在ndk主目录下的ndk-build 文件
在 TestNdk/libs下生成 libtestndk.so
9、MainActivity.java 使用
static {
System.loadLibrary("testndk");
}
int iSum = SumJni.nativeGetSum(2,4);