当前位置:网站首页>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++代码
}
边栏推荐
- 一键部署Redis任意版本
- torch. nn. functional. Pad (input, pad, mode= 'constant', value=none) record
- sql 常用优化
- Detailed explanation of Flink parallelism and slot
- About cv2 dnn. Readnetfromonnx (path) reports error during processing node with 3 inputs and 1 outputs [exclusive release]
- One click deployment of any version of redis
- vulnhub之Funfox2
- LeetCode_ 7_ five
- Force buckle 1037 Effective boomerang
- Implement secondary index with Gaussian redis
猜你喜欢
Compiler optimization (4): inductive variables
Vulnhub tre1
关于cv2.dnn.readNetFromONNX(path)就报ERROR during processing node with 3 inputs and 1 outputs的解决过程【独家发布】
整型int的拼接和拆分
vulnhub之tre1
Some important knowledge of MySQL
Ways to improve the utilization of openeuler resources 01: Introduction
About cv2 dnn. Readnetfromonnx (path) reports error during processing node with 3 inputs and 1 outputs [exclusive release]
AIRIOT助力城市管廊工程,智慧物联守护城市生命线
ASP.NET学习& asp‘s one word
随机推荐
Force buckle 599 Minimum index sum of two lists
Vulnhub's funfox2
力扣 989. 数组形式的整数加法
TS quick start - Generic
Detailed explanation of Flink parallelism and slot
Solve the problem of incomplete display around LCD display of rk3128 projector
Traversal of Oracle stored procedures
【解决】package ‘xxxx‘ is not in GOROOT
vulnhub之tre1
[auto.js] automatic script
841. String hash
Machine learning notes - explore object detection datasets using streamlit
CSDN syntax description
【Auto.js】自动化脚本
pom.xml 配置文件标签作用简述
有用的win11小技巧
浅尝不辄止系列之试试腾讯云的TUIRoom(晚上有约,未完待续...)
openEuler 有奖捉虫活动,来参与一下?
Chapter 20 using work queue manager (3)
Force buckle 674 Longest continuous increasing sequence