基于Android studio3.6的JNI教程之helloworld思路详解
jdk环境变量配置:
path中增加下面2个路径,也就是android studio的路径,android有自带的jdk。
E:AndroidAndroid Studiojrebin
E:AndroidAndroid Studiobin
新建工程:
一定要选择Native c++类型,最后要选c++11支持。
SDK设置:
File- Settings
File- Project Structure
首先确定工程的目录结构,然后尝试运行一下工程,使用模拟器,确保工程没问题,
在MainActivity
的同级目录,新建一个hello.java,然后做一个简单的实现,
package com.example.myapplication;
public class hello {
public native int add(int i, int j);
}
使用android studio自带的Terminal进入该hello.java所在目录,执行,
javac hello.java
Terminal下回到app/src/main所在目录,执行,
javah -d jni -classpath ./java com.example.myapplication.hello
此时,会在main目录下面生成一个和cpp,java同级的目录jni。
在该目录结构里面新建hello.cpp。
将com_example_myapplication_hello.h
中的内容复制进hello.cpp中,并且进行方法的实现,
#include <jni.h
/* Header for class com_example_myapplication_hello */
#ifndef _Included_com_example_myapplication_hello
#define _Included_com_example_myapplication_hello
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_example_myapplication_hello
* Method: add
* Signature: (II)I
*/
#include "com_example_myapplication_hello.h"
JNIEXPORT jint JNICALL Java_com_example_myapplication_hello_add
(JNIEnv *, jobject, jint i, jint j){return i+j;}
#ifdef __cplusplus
}
#endif
#endif
将com_example_myapplication_hello.h,hello.cpp
这连个文件复制到cpp所在的目录,
然后修改CMakeLists.txt,增加,
add_library( # Sets the name of the library.
hello
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
hello.cpp )
修改target_link_libraries如下,
target_link_libraries( # Specifies the target library.
native-lib
hello
# Links the target library to the log library
# included in the NDK.
${log-lib} )
修改hello.java的调用方式,
package com.example.myapplication;
public class hello {
static {
System.loadLibrary("hello");
}
public native int add(int i, int j);
}
修改MainActivity.java
中的onCreate函数,
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Example of a call to a native method
TextView tv = findViewById(R.id.sample_text);
//tv.setText(stringFromJNI());
tv.setText("hello 9+10= " + new hello().add(9, 10));
}
然后,rebuild project
,没有错误后,然后run app
。
最终程序整体目录结构,以及运行效果,
JNI的整体流程思路:
Java先定义一个类,类中定义一个需要c++来实现的方法.通过javah生成需要c++实现的.h的c++头文件实现.h的c++头文件中定义的方法Cmake编译运行
总结
到此这篇关于基于Android studio3.6的JNI教程之helloworld思路详解的文章就介绍到这了。
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- CMake学习笔记
- 性能分析(2)- 应用程序 CPU 使用率过高案例
- 性能测试必备知识(7)- 深入理解“CPU 使用率”
- Jmeter 常用函数(31)- 详解 __iterationNum
- Jmeter 常用函数(30)- 详解 __if
- Jmeter 常用函数(29)- 详解 __eval
- Jmeter 常用函数(28)- 详解 __FileToString
- Jmeter 常用函数(26)- 详解 __chooseRandom
- Jmeter 常用函数(25)- 详解 __V
- Java8新特性
- 线程池基础
- 多线程基础
- 02 Spring Boot整合JDBC
- 01 Spring Boot 入门
- Spring——单例Bean中使用多例Bean