Android使用JNI入门

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xxkalychen/article/details/82453342

使用JNI的必要性就不多说了,开始之前要下载NDK工具,在AS的SDK管理页面可以选择,配置好NDK的路径。

新建一个项目,我的项目名为MyJniDemo。

在布局中建一个TextView,用来显示我们最后调用的结果,这里不多说。

创建一个类MyMathUtils,在其中创建一个静态的本地方法。我在上一个demo中创建的是普通方法,这里尝试静态方法。

package com.chris.myjni;

public class MyMathUtils {
    public static native int getSum(int a,int b);
}

这里可以看到包名。

接下来要编译这个类。进入这个类所在文件夹,编译。如果javac不能用,请设置好环境变量。

接着要生成头文件,使用javah命令,不过这个命令是循着包名去找类的,所以一定要退回到源码根文件夹下面执行,默认就是java文件夹,即这个位置:app/src/main/java。

执行命令:javah com.chris.myjni.MyMathUtils,不需要带后缀。

然后就会出现com_chris_myjni_MyMathUtils.h这个文件,这是C的头文件。

我们在项目下面创建一个jni文件夹。new-->folder-->JNI Folder,勾选Change folder Location.

在project视图,把头文件复制到jni文件夹。

在jni文件夹内,创建头文件的实现。创建一个.c或.cpp源码文件com_chris_myjni_MyMathUtils.c,实现接口方法。我们这里只做一个简单的,把两个参数相加返回就好了。实际上,哈哈,我对C++不熟悉。

#include "com_chris_myjni_MyMathUtils.h"

JNIEXPORT jint JNICALL Java_com_chris_myjni_MyMathUtils_getSum
  (JNIEnv *env, jclass obj, jint a, jint b)
{
    return a+b;
}

实现类就这样,注意在参数表中把参数名加上。

接着我们要配置一个Android.mk文件。配置的具体说明可以搜索。

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
#编译生成的文件的类库名
LOCAL_MODULE    := MyMath
#要编译的c文件
LOCAL_SRC_FILES := com_chris_myjni_MyMathUtils.c
include $(BUILD_SHARED_LIBRARY)

有两个地方需要修改。那个MyMath,我故意设置成不同的,加载类库的时候就用这个名字。

我们回到MyMathUtils这个类,加个静态块,用以加载类库。

package com.chris.myjni;

public class MyMathUtils {
    static {
        System.loadLibrary("MyMath");
    }
    public static native int getSum(int a,int b);
}

到jni文件夹,执行ndk-build。

一路没有错误,我们再看看AS的project视图,会发现多出两个文件夹libs和obj。

到模块(默认app)的build.gradle中,找到sourceSets-->main,可以看到下面已经有个jni.srcDirs设置,把中括号里面的路径全部删掉,因为我们已经编译过了。

然后在下面加上jniLibs.srcDirs=['src/main/libs']

这个路径就是刚才生成的so库的路径,里面是很多适应不同平台的类库。

我们可以回到Activity,把把使用的代码加上了。

        txtResult.setText("" + MyMathUtils.getSum(19780728, 19810221));

最后看一下运行结果:

猜你喜欢

转载自blog.csdn.net/xxkalychen/article/details/82453342
今日推荐