一、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/ndk/guides?hl=zh_cn
Android studio jni 入门helloworld https://blog.csdn.net/salute_li/article/details/52469214