Android下使用JNI & NDK (1)

ぐ巨炮叔叔 提交于 2020-12-27 00:19:37

说明 :前提是安装好 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语言的字符串。


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!