说明 :前提是安装好 NDK 使用环境,安装过程网上很多,搜一下即可,Win或Linux都行。
1.首先新建一个Android工程。
2.新建一个类,存放本地方法的声明(这一步可有可无,直接放在使用该方法的类中也行)
package a.b;
public class JniMethod {
public native void sayHello();
public native String getSomeWords();
}
3.生成头文件(这一步建立在已经有class文件)
在命令行中(cygwin或windows自带都行),进入工程所在目录,比如:
cd /cygdrive/e/androidSource-1/HelloJni_02 //进入目录
mkdir jni //创建jni目录
javah -d jni/ -classpath bin/classes a.b.JniMethod //生成头文件 -d jni 表示存放到jni目录 -classpath 制定class文件所在目录
生成的头文件如下:
#include "a_b_jnimethod.h"
JNIEXPORT void JNICALL Java_a_b_JniMethod_sayHello
(JNIEnv *, jobject ){
}
/*
* Class: a_b_JniMethod
* Method: getSomeWords
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_a_b_JniMethod_getSomeWords
(JNIEnv *, jobject){
return (*env)->NewStringUTF(env, "My name is JNI !");
}
注意:生成的函数中,参数只有类型,没有名字,所以要添加上。
4.编写C语言实现文件
如下:
#include "a_b_jnimethod.h"
JNIEXPORT void JNICALL Java_a_b_JniMethod_sayHello
(JNIEnv *env, jobject jo){
}
/*
* Class: a_b_JniMethod
* Method: getSomeWords
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_a_b_JniMethod_getSomeWords
(JNIEnv *env, jobject jo){
return (*env)->NewStringUTF(env, "My name is JNI !");
}
注意:*env 是指向一个函数集的指针,每个线程一个,后面再深入。
5.编译成库文件
想要编译成库文件,必须要有mk文件,如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := jni //这是库名
LOCAL_SRC_FILES := JniMethod.c //这是依赖的文件
include $(BUILD_SHARED_LIBRARY)
进入刚才创建的 jni 目录,执行 ndk-build 进行编译。
注意:ndk-build 是一个ndk的命令,需要配置,在搭建ndk环境时配置一下。
6.使用
在Activity中,加载库,并使用:
static {
System.loadLibrary("jni");
}
static语句块是先与构造方法执行,习惯上在一开始就加载库,后面直接使用:
((TextView)rootView.findViewById(R.id.title)).setText(new JniMethod().getSomeWords());
这样就从java中得到了C语言的字符串。
来源:oschina
链接:https://my.oschina.net/u/1428119/blog/304946