最近忙得跟孙子似的,由于业务需要,开始介入jni的研究。
说到研究还有点自惭形秽,我现在只能算是一根脚趾头步入jni开发的Android开发者,下面总结下一个简单的jni的demo,基本相当于helloworld级别的小demo。
首先配置环境,ndk下载好了,解压 或者安装。(版本尽量搞,我用的是10d)
然后打开eclipse(目前还在使用eclipse~都2016年了): Window->preferences->Android->NDK->指向NDK的路径;(有的eclipse没有这个选项,换个sdk版本试试)
然后配置环境变量: path里面加如NDK路径
然后开始写代码了:
举个我写的第一个栗子~
package com.kurt.jni;
public class KurtJni {
public native String PrintStr();
public native int PrintInt();
}
贼简单的两个方法,然后在在文件夹中切换到bin目录下的classes路径,执行javah 口令,以我的demo为例,执行的是javah com.kurt.jni.KurtJni 回车
然后你就在classes目录下看见一个com_kurt_jni_KurtJni.h的文件copy出来,在android工程路径下新建个jni文件夹~放进去,再新建个同名的 .c文件,在c文件中实现方法:
简单的栗子:
JNIEXPORT jstring JNICALL Java_com_kurt_jni_KurtJni_PrintStr(JNIEnv *env,
jobject obj, jstring inputStr) {
return (*env)->NewStringUTF(env, "this is from Cpp");
}
JNIEXPORT jint JNICALL Java_com_kurt_jni_KurtJni_PrintInt(JNIEnv *env,
jobject obj, jint inputInt) {
int x = 1;
return x;
}
然后新建个.mk文件,编辑它:
LOCAL_PATH:= $(call my-dir)
# 一个完整模块编译
include $(CLEAR_VARS)
LOCAL_SRC_FILES:=com_kurt_jni_KurtJni.c
LOCAL_C_INCLUDES := $(JNI_H_INCLUDE)
LOCAL_MODULE := libKurt
LOCAL_SHARED_LIBRARIES := libutils
LOCAL_PRELINK_MODULE := false
LOCAL_MODULE_TAGS :=optional
LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog
include $(BUILD_SHARED_LIBRARY)
好,然后cmd 切换到 jni对应的路径下 执行 ndk-build 口令,然后 你就发现~什么也没有。
再去看libs目录下,如果编译没提示error的话,libs里已经有一个so包了
然后我们开始调用它:
在需要的时候:
然后 运行下,打印出来瞅瞅。
具体的细节咱们后面再讲(等我再搞明白点),其实思路已经很清楚了。c中实现方法,java声明方法,jni在中间拉皮条,根据mk的规定编译出so包(运行库),然后通过调用java的方法,c去执行,拿到结果然后~想干嘛就干嘛了~~先说到这吧,一起学习一起努力,我自己也才刚刚走上jni开发的不归路没几天....