JNI学习与NDK入门

一、JNI 学习

JNI(Java Native Interface,JAVA原生接口),使用JNI可以使Java代码和其他语言写的代码(如C/C++代码)进行交互。JNI 是一个协议,虚拟机通过 这个协议用来沟通java代码和外部的本地代码(c/c++).
1.生成头文件
新建JNIDemo.java文件,然后声明native方法 public native void testHello();

Javac JNIDemo //生成.class文件,然后//退回到classes一级目录
> cd  /home/gms/Project/AutoClick/app/src/main/java
> javah com.example.autoclick.JNIDemo;

package com.example.autoclick;

public class JNIDemo {
    static{
        System.load("/home/gms/Project/AutoClick/app/libs/libjnidemo.so");
    }
    public native void testHello();
    public static void main(String[] args){
       // System.loadLibrary("libjnidemo");

        JNIDemo jniDemo = new JNIDemo();
        jniDemo.testHello();
    }
}

2. 编写C文件

头文件中testHello()对应的函数:Java_com_example_autoclick_JNIDemo_testHello ;

生成规则:Java_ + 包名(com.example.autoclick) + 类名(JNIDemo) + 接口名(testHello )

java虚拟机就可以在java类调用testHello接口的时候自动找到这个C实现的Native函数调用。
创建JNIDemo.cpp,# include "*.h",然后复制h文件中函数到cpp file;

3. 编译C文件

g++ -I /usr/lib/jvm/java-8-openjdk-amd64/include  -I/usr/lib/jvm/java-8-openjdk-amd64/include/linux JNIDemo.cpp -fPIC -shared -o libjnidemo.so

4.使用SO

 System.load("/home/gms/Project/AutoClick/app/libs/libjnidemo");
5.run app
javac JNIDemo.java;

二、NDK入门

Android NDK(Native Development Kit) 是一系列工具的集合,帮助开发者快速开发 C 或 C++库.。环境搭建

1.下载组件 从菜单栏依次选择 Tools > SDK Manager ->sdk tool  勾选NDK;CMake;LLDB,点击 Apply,点击Finsh.

 2.配置NDK环境变量

subl ~/.bashrc添加

export NDK_HOME=/home/gms/Android/Sdk/ndk/21.0.6113669

export PATH=$PATH:$NDK_HOME

source ~/.bashrc  

3.配置项目NDK路径

project File -- Project Structure -- SDK Location--Select default NDK

4.创建头文件,编写C文件

5.配置mk与编译项目(两种方式)

(1)配置gradle

在app下的gradle文件下添加

android { defaultConfig{

        ndk {
            moduleName "jnidemo"
            ldLibs "log", "z", "m"
            abiFilters "armeabi", "armeabi-v7a", "x86"
        }
}

sourceSets { main { jni.srcDirs = ['src/main/jni', 'src/main/jni/'] } }

}

(2)生成so

rebuild生成.so文件 build->rebuild project

(3)复制so

在main文件夹下建立 jinLIB文件夹 把.so按文件夹复制进去或者修改sourceSets

    sourceSets {
        main {
            manifest.srcFile 'src/main/AndroidManifest.xml'
            jni.srcDirs = [] //屏蔽掉默认的jni编译生成过程
            jniLibs.srcDirs = ['src/main/libs/']
        }
    }

app.gradle defaultConfig:
        ndk {
            ldLibs "log", "z", "m"
            abiFilters "armeabi-v7a"
        }
./build/intermediates/merged_jni_libs/debug/out/libjnidemo.so

创建mk文件

.编写Android.mk文件  

LOCAL_PATH := $(call my-dir) #编译时的目录  

include $(CLEAR_VARS) #清除之前的一些系统变量

  LOCAL_MODULE    := JNITest #编译生成的so库的名称

LOCAL_SRC_FILES := hello_jni.c #源文件      

include $(BUILD_SHARED_LIBRARY) #指明要编译成动态库

编写 Application.mk     

APP_ABI := all  

.Ndk编译生成动态库  

在jni目录执行 $ ndk-build  

生成库文件所在目录:libs/*/JNITest .so,因为Application.mk中配置all会生成各种架构下的so文件

5.Java代码load 动态库.调用native代码  ·  通过点击 Run 图标 编译并运行应用。

Gradle 会以依赖项的形式添加 CMake 或 ndk-build 进程,用于编译原生库并将其随 APK 一起打包。  

在app 下的gradle文件下添加(配置so库)

app.gradle android:     sourceSets {         main {             jniLibs.srcDirs = ['src/main/libs/']//so路径         }     }

https://developer.android.google.cn/studio/projects/add-native-code.html?hl=zh_cn#create-cmake-script

参考

https://developer.android.google.cn/ndk/guides?hl=zh_cn

Android studio jni 入门helloworld https://blog.csdn.net/salute_li/article/details/52469214

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值