首先:Android NDK的使用环境需要配置ndk 和adt是适配的,我使用的ADT版本是23.0.6,ndk为:android-ndk-r12b-windows-x86_64(文章末尾会贴出资源,下载地址可能要翻墙一下:https://developer.android.com/ndk/downloads/index.html);ndk是等下生成so文件的关键。
1.当环境变量等准备工作都做好了后,就可以开始编程了,一般有的人是直接写.C文件,但有时候我们的方法命名格式不一定对。所以我今天要使用的是自己生成一个.h文件,然后中间会有.c文件的方法名格式(对于记不住东西的我,我感觉这个方法是极好的)。
2新建项目,在类中申明方法 例:
public native static String getMessage();
public native static String getMessageforshelf(String msg);
这里我申明了两个方法一个带参,一个不带,然后在主目录下新建一个jni文件夹,打开cmd:进入当前文件目录:D:\myTeam\Review>javah -classpath bin/classes;D:\tools\android.jar -d jni com.lu
osu.review.NdkActivity, 这句命令的作用就是:会在jni目录下生成一个.h文件,这个.h文件中会含有生成的方法格式。
JNIEXPORT jstring JNICALL Java_com_luosu_review_NdkActivity_getMessage
(JNIEnv *, jclass);
/*
* Class: com_luosu_review_NdkActivity
* Method: getMessageforshelf
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_luosu_review_NdkActivity_getMessageforshelf
(JNIEnv *, jclass, jstring);
我们只需新建一个.c文件讲两个方法复制过去,例如:
#include <stdio.h>
#include <stdlib.h>
#include "com_luosu_review_NdkActivity.h"
JNIEXPORT jstring JNICALL Java_com_luosu_review_NdkActivity_getMessage
(JNIEnv * env, jclass jclass){
//这句话的意思就是生成一个新的字符串
return (*env)->NewStringUTF(env, "hello my world");
}
JNIEXPORT jstring JNICALL Java_com_luosu_review_NdkActivity_getMessageforshelf
(JNIEnv * env, jclass jclass, jstring str){
return str;
}
3,当.c文件写好了以后,我们需要在jni文件夹下建立一个Android.mk用于配置一些信息:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
#LOCAL_MODULE表示生成的库的名字,前面的lib和后缀名不用写
LOCAL_MODULE := myndk
LOCAL_SRC_FILES := myndk.c
include $(BUILD_SHARED_LIBRARY)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
LOCAL_MODULE 的意思就是 生产so包的名字 ,前面不需要加lib 系统会自动帮我们生产,
有时还可以建立一个Application.mk文件,可以指定一下我们需要适配的系统级环境,如果不指定也可以生成所有的so包;
APP_ABI :=armeabi,x86
3.打开cmd,在当前目录下调用一下ndk-build就会在你的项目中生产一个obj文件夹,里面有你的so包,
到此:生产so包的过程已经结束
4.调用:
在我们的类中建静态代码块,进行加载我们生成ndk: static{
System.loadLibrary("myndk");
}
由于我们先前已经什么了方法,所以可以直接调用了:
tv.setText(getMessage());
tvshelf.setText(getMessageforshelf("你好,我的世界"));
DEMO的下载地址:
http://download.csdn.net/detail/android_luosu/9662987