当前位置:网站首页>JNI 初级接触
JNI 初级接触
2022-07-07 18:13:00 【黑桃_K_】
什么是JNI?
JNI(Java Native Interface),(JNI) 标准是java 平台的一部分,它允许Java 代码和其他语言写的代码进行交互。JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) 内部运行的 Java 代码能够与用其它编程语言( 如 C 、C++ 和汇编语言) 编写的应用程序和库进行交互操作。
Andoird 中使用了一种不同传统Java JNI 的方式来定义其native 的函数。
其中很重要的区别是Andorid 使用了一种Java 和 C 函数的映射表数组,并在其中描述了函数的参数和返回值。这个数组的类型是JNINativeMethod,定义如下:
typedef struct {
const char* name; /*Java 中函数的名字*/
const char* signature; /* 描述了函数的参数和返回值*/
void* fnPtr; /* 函数指针,指向C 函数*/
} JNINativeMethod;
Signature说明:
例子:
--"()V"
--"(II)V"
--"(Ljava/lang/String;Ljava/lang/String;)V"
说明:
--"()" 中的字符表示参数,后面的则代表返回值。例如"()V" 就表示void Func();
--"(II)V" 表示 void Func(int, int);
--"(Ljava/lang/String;Ljava/lang/String;)V“ 表示void Func(String, String);
在java中用native语句声明,调用规定格式写成的函数名。
CMakeLists.txt
cmake_minimum_required(VERSION 3.18.1) # CMake 的最低版本
project("myapplication") #项目名称
add_library(
myapplication
SHARED
myapplication.cpp )
find_library(
log-lib
log )
target_link_libraries(
myapplication
${
log-lib} )
myapplication.cpp:
#include<jni.h>
extern "C"
JNIEXPORT jint JNICALL
Java_com_example_myapplication_MainActivity_catTest(JNIEnv *env, jobject thiz) {
// TODO: implement cat_test()
std::cout<<"test function__"<<std::endl;
return 0;
}
JNIWXPORT:在Jni编程中所有本地语言实现Jni接口的方法前面都有一个"JNIEXPORT",这个可以看做是Jni的一个标志.
JNICALL :这个可以理解为Jni 和Call两个部分,和起来的意思就是 Jni调用XXX(后面的XXX就是JAVA的方法名)。
Java_com_example_myapplication_MainActivity_catTest:这个就是被上一步中被调用的部分,也就是Java中的native 方法名,这里起名字的方式比较特别,是:包名+类名+方法名。
JNIEnv* env:这个env可以看做是Jni接口本身的一个对象,jni.h头文件中存在着大量被封装好的函数,这些函数也是Jni编程中经常被使用到的,要想调用这些函数就需要使用JNIEnv这个对象。例如:env->GetObjectClass()。(详情请查看jni.h)
jobject thiz:代表着native方法的调用者,本例即new NativeDemo();但如果native是静态的,那就是NativeDemo.class
MainActivity:
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
catTest();
}
static{
System.loadLibrary("myapplication"); //加载C++生成动态库
}
public native int catTest();//调用C++代码
}
边栏推荐
- 力扣 912.排序数组
- Simulate the implementation of string class
- 力扣 1961. 检查字符串是否为数组前缀
- torch. nn. functional. Pad (input, pad, mode= 'constant', value=none) record
- Get webkitformboundary post login
- [philosophy and practice] the way of program design
- Implement secondary index with Gaussian redis
- 【mysql篇-基础篇】事务
- Cloud component development and upgrading
- Sword finger offer II 013 Sum of two-dimensional submatrix
猜你喜欢
随机推荐
力扣 2315.统计星号
Opencv学习笔记 高动态范围 (HDR) 成像
Compiler optimization (4): inductive variables
How to test CIS chip?
pom.xml 配置文件标签作用简述
BI的边界:BI不适合做什么?主数据、MarTech?该如何扩展?
How to implement safety practice in software development stage
力扣599. 两个列表的最小索引总和
School 1 of vulnhub
Force buckle 674 Longest continuous increasing sequence
Solve the problem of incomplete display around LCD display of rk3128 projector
Force buckle 1790 Can two strings be equal by performing string exchange only once
MRS离线数据分析:通过Flink作业处理OBS数据
力扣 1961. 检查字符串是否为数组前缀
rk3128投影仪lcd显示四周显示不完整解决
Read PG in data warehouse in one article_ stat
搞定带WebKitFormBoundary post登录
多个线程之间如何协同
【STL】vector
[auto.js] automatic script