第一个jni的hello world坑真多,看了几篇博文,修改了代码,终于成功了,特此记录一下过程:
1.新建项目,包名为com.test.hellojni,当要调用jni的函数时,类的包名要与com.test.hellojni包名一致,否则会报调用jni函数失败。
2.配置NDK环境:
打开sdk manager:勾选ndk,点击申请,即可安装好ndk(ndk后显示安装,则表示安装成功)
在gradle.properties中加入代码:
android.deprecatedNdkCompileLease=1515138691572
local.properties显示NDK路径表示安装成功:
再配置NDK的环境变量:看图:
这是我的NDK安装目录:
命令行输入NDK-builde,输出如下,表示NDK的所有配置完毕:
新建JniTest类:(注意:这里的的的LoadLibrary(“JniTest”);中的JniTest命名应该和后面生成的所以前缀一致,若这样库文件为libJniTest.so,那么这里应该命名为JniTest)
package com.test.hellojni;
public class JniTest {
static {
System.loadLibrary("JniTest");
}
public static native String getNativeString();
}
打开命令行,进入项目所在的新建类的目录下,输入相关命令如下:
其中javah的执行路径不对,故报错,需要cd ../../ ..进入到java目录下:执行javah com.test.hellojni.JniTest如图:
此时会在Java的的目录下生成该类的.H文件,运行完命令后我的项目生成的文件如下:
4.在src / main下新建jni floder文件
然后删除之前建的JniTest.class文件,将com_test_hellojni_JniTest.h文件移到JNI文件下,在JNI下新建JniTest.c,内容如下:
#include <string.h>
#include <jni.h>
jstring Java_com_test_hellojni_getNativeString(JNIEnv *env, jobject thiz)
{
// callJavaMethod(env, thiz);
return (*env)->NewStringUTF(env, "Hello from JNI !");
}
6.jni下新建Android.mk :(注意:JniTest要与这样库的名字一致,JniTest.c与之前创建的.C一致,别的不用改)
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := JniTest
LOCAL_SRC_FILES := JniTest.c
include $(BUILD_SHARED_LIBRARY)
JNI下新建Application.mk:
APP_ABI := all
接下来用NDK建造命令生成的.so文件,命令行进入JNI目录,输入:NDK建造,生成的.so文件成功:
再MainActivity中通过JniTest.getNativeString()调用JNI的函数,后面将LIB下的所以文件移入应用下的LIB中,在的的build.gradle的机器人类加入:
在gradle.properties中添加代码:
android.deprecatedNdkCompileLease=1515138691572
最后我的项目结构为:
运行截图为:
后面会接着写如何动态生成链接库