JNI入门教程1---Android studio 下JNI编程实例并生成so库

参考地址: https://www.cnblogs.com/jymblog/p/5526865.html

                  https://www.jianshu.com/p/ac00d59993aa

1.JNI的概述

     JNI的全称就是Java Native Interface,顾名思义,就是Java和C/C++相互通信的接口,就好比买卖房子都需要找中介一样,这里的JNI就是Java和C/C++通信的中介,一个中间人。

2.JNI的用途

                                       

     1.主要是一些算法,因为c/c++比Java效率高,所以应用运行起来速度比较快,特别是一些游戏中的算法.
     2.为了保密,都知道apk都可以被反编译,就算有代码混淆,也只是难看懂,并不是完全看不懂,但用jni编译成.so就不同了,所以可以达到商业机密不泄露的目的。
     3.一个平台(C++代码)迁移到Android平台,底层逻辑是相同的,这样就可以通过移植,利用JNI调用底层C++代码,避免相同逻辑的代码重复去写,不过这个过程一定要注意底层对象的释放问题。
    4.与一些硬件驱动的通信(串口等)

  • 扩展:JNI扩展了JVM能力,驱动开发,例如开发一个wifi驱动,可以将手机设置为无限路由;
  • 高效: 本地代码效率高,游戏渲染,音频视频处理等方面使用JNI调用本地代码,C语言可以灵活操作内存;
  • 复用: 在文件压缩算法 7zip开源代码库,机器视觉 OpenCV开放算法库等方面可以复用C平台上的代码,不必在开发一套完整的Java体系,避免重复发明轮子;
  • 特殊: 产品的核心技术一般也采用JNI开发,不易破解;

3.编写Jni实现native方法的调用

    1.编写jni文件,实现本地方法

      

public class MainActivity extends AppCompatActivity {

    private Button mBtn;
    private Button mjni;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mBtn = ((Button) findViewById(R.id.btn));
        mBtn.setOnClickListener(new View.OnClickListener() {
            @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1)
            @Override
            public void onClick(View v) {
                DisplayManager mDisplayManager;//屏幕管理类

                Display[] displays;//屏幕数组

                mDisplayManager = (DisplayManager) getSystemService(Context.DISPLAY_SERVICE);

                displays = mDisplayManager.getDisplays();
                if (displays != null) {
                    Presentation presentation = new MyPresentation(MainActivity.this, displays[1]);
                    presentation.show();
                }
            }
        });

        mjni = ((Button) findViewById(R.id.btn_jni));
        mjni.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String info=JniMethod.getNativeString("你好");
                Toast.makeText(MainActivity.this, info, Toast.LENGTH_SHORT).show();
            }
        });

    }


}

     2.生成.h的头文件

       该文件即连接java和c(c++)的桥梁,里面有Android工程里本地方法的声明。这个文件可以在“控制台”用javah命令自动生成

     

       

 在下面这个路径生成了目录和.h的头文件(头文件的名称不可以修改

3.新建cpp文件,进行方法的实现,(还要多加个空的cpp文件empty.cpp)   

     .h文件的方法声明

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_aier_testdemos_JniMethod */

#ifndef _Included_com_aier_testdemos_JniMethod
#define _Included_com_aier_testdemos_JniMethod
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_aier_testdemos_JniMethod
 * Method:    getNativeString
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_aier_testdemos_JniMethod_getNativeString
  (JNIEnv *, jclass, jstring);

#ifdef __cplusplus
}
#endif
#endif

     cpp文件的方法实现(JniMethod.cpp)

#include <jni.h>
#include<com_aier_testdemos_JniMethod.h>
#include<stdio.h>
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_aier_testdemos_JniMethod
 * Method:    getNativeString
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_aier_testdemos_JniMethod_getNativeString
  (JNIEnv *, jclass, jstring);

#ifdef __cplusplus
}
#endif

JNIEXPORT jstring JNICALL Java_com_aier_testdemos_JniMethod_getNativeString
  (JNIEnv *env, jclass, jstring){
  return  env->NewStringUTF("I'm comes from to Native Function!");
  }

    4.把jni文件加复制,放到main目录下

        

  5.配置相关配置

  

 6.编译运行!

猜你喜欢

转载自blog.csdn.net/qq_35014796/article/details/82757324
今日推荐