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

配置环境

  • 下载NDK ,并进行环境配置,如图:

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

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


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


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

android.useDeprecatedNdk=true

如图:


JNI实现

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

生成 .h 文件

新建TestJNI

public class TestJNI {   public native String HelloWord(String str);}

cmd命令下面,cdjava目录,输入javah -jni com.muji.jnitestdemo.TestJNI命令,生成 .h 文件:


注意: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 __cplusplusextern "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 >NewFolder > JNI Folder 生成jni目录如图:


然后拷贝com_github_jni_demo_TestJNI.hjni目录下面:


生成 .C 文件

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


拷贝以下代码到 .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 如图:


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


Java中调用JNI

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


接着在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("恭喜你,调用成功!"));    }}

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

更多相关文章

  1. Android(安卓)studio的NDK配置
  2. ubuntu14.04下搭建Android编译环境
  3. [Android(安卓)API学习]Data Storage胡乱翻译(1)
  4. Android(安卓)Studio启动崩溃的问题:Start Failed Internal error
  5. WebView:Android-H5交互
  6. AndroidStudio开发flutter之环境配置
  7. cocos2dx在windows下开发,编译到android上(1)
  8. 关于android中的内部存储与外部存储
  9. 对 android apk 进行重新签名操作

随机推荐

  1. Android(安卓)自定义控件外观
  2. Android(安卓)Spinner与适配器模式详解及
  3. Android温故之-BroadcastReceiver
  4. android实现横向滚动
  5. Android(安卓)的木马危机
  6. Android新手入门2016(2)--Mac下的Android开
  7. 【Android】在不同的线程池中执行AsyncTa
  8. 用c#开发安卓程序 (xamarin.android)系列
  9. [置顶] [Android(安卓)Studio 权威教程]Win
  10. 【30篇突击 android】源码统计 十九