Android编程中jni,Android Studio JNI 开发简单案例

进程保活,热修复,硬件接入等等都需要底层的支持,而底层代码是 C 、C++ 写的,那么在 Android 中怎么调用底层的库呢?这里就需要了解 JNI 技术。

Android Studio 出来两年多了,网上针对 AS 开发 JNI 工程资源比较少,针对于此,我特意写下本篇博客,希望能对大家有所帮助。

配置环境

下载NDK 请点击这里 ,并进行环境配置,如图:

44119589a4a5c8c35ff6c171cd79fe96.png

项目关联NDK ,具体操作如图:

右键你的工程项目,选择 【Open Module Settings】

8e5d3f10427da04f51e878e2615b16af.png

在 【Android NDK location】配置 NDK 的按着目录:

21d91a62d67139c1e314ffe82a3b0757.png

最后在 项目根目录 【gradle.properties】 下加上:

android.useDeprecatedNdk=true

如图:

43b41b6da867b8b2a232b2c8c821680d.png

JNI实现

新建 JNI_DEMO 项目,完成以上的配置工作。我的项目路径为:D:\Android_Study_Demos\JNI_DEMO

生成 .h 文件

新建TestJNI类

public class TestJNI {

public native String HelloWord(String str);

}

6e0d9c1f58953bed09adf94816dd56ed.png

在cmd命令下面,cd到java目录,输入javah -jni com.github.jni_demo.TestJNI命令,生成 .h 文件:

2967a66a0024b80ccf4964c1353ee33c.png

注意:com.github.jni_demo.TestJNI 不能 cd com , cd github……否则编译不成功。

你会发现在你的java路劲下生成了com_github_jni_demo_TestJNI.h文件:

/* DO NOT EDIT THIS FILE - it is machine generated */

#include

/* Header for class com_github_jni_demo_TestJNI */

#ifndef _Included_com_github_jni_demo_TestJNI

#define _Included_com_github_jni_demo_TestJNI

#ifdef __cplusplus

extern "C" {

#endif

/*

* Class: com_github_jni_demo_TestJNI

* Method: HelloWord

* Signature: (Ljava/lang/String;)Ljava/lang/String;

*/

JNIEXPORT jstring JNICALL Java_com_github_jni_1demo_TestJNI_HelloWord

(JNIEnv *, jobject, jstring);

#ifdef __cplusplus

}

#endif

#endif

然后右键 app >New> Folder > JNI Folder 生成jni目录如图:

8356847cd7c37b9518330d6e005ac4a8.png

然后拷贝com_github_jni_demo_TestJNI.h到jni目录下面:

3d648b57cb0f0c196c0274f305744a64.png

生成 .C 文件

右键jni,生成com_github_jni_demo_TestJNI.cpp文件:

a085f41e42e44237984c325d2c3cf6e3.png

拷贝以下代码到 .cpp 文件中:

#include

#include

#include "com_github_jni_demo_TestJNI.h"

JNIEXPORT jstring JNICALL Java_com_github_jni_1demo_TestJNI_HelloWord

(JNIEnv *env, jobject, jstring str) {

return str;

}

build.gradle 配置 ndk

在defaultConfig节点下加入如下代码:

ndk {

moduleName "TestJNI"

abiFilters "armeabi", "armeabi-v7a", "x86"

}

点击 Build > Make Project 如图:

6e17b76bbc6785b3f1f42f883a781a7b.png

编译成功后,打开 build > intermediates > ndk > debug > lib 下查看生成的 .so 文件:

c92258314db6ee5a7035400a4cce8e62.png

Java中调用JNI

记得把生成的 .so 文件拷贝到项目的 libs 目录下:

23c4f6608226cb32f31b876f819634e2.png

接着在Java中调用JNI:

package com.github.jni_demo;

import android.os.Bundle;

import android.support.v7.app.AppCompatActivity;

import android.util.Log;

public class MainActivity extends AppCompatActivity {

static { // 加载动态库

System.loadLibrary("TestJNI");

}

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

TestJNI testJNI=new TestJNI();

Log.e("---------------","************"+testJNI.HelloWord("恭喜你,调用成功!"));

}

}

2446755a055439029057c8adc29916e6.png

这样你就生成了一个属于自己的 .so 文件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值