当前位置:网站首页>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++代码
}
边栏推荐
猜你喜欢
随机推荐
Splicing and splitting of integer ints
MRS离线数据分析:通过Flink作业处理OBS数据
AIRIOT助力城市管廊工程,智慧物联守护城市生命线
九章云极DataCanvas公司获评36氪「最受投资人关注的硬核科技企业」
Force buckle 1037 Effective boomerang
One click deployment of any version of redis
数据孤岛是企业数字化转型遇到的第一道险关
网络原理(1)——基础原理概述
力扣 989. 数组形式的整数加法
LeetCode_ 7_ five
ASP. Net learning & ASP's one word
Implement secondary index with Gaussian redis
Cuda版本不一致,编译apex报错
Solve the problem of incomplete display around LCD display of rk3128 projector
Mongodb由浅入深学习
How C language determines whether it is a 32-bit system or a 64 bit system
线性基
力扣674. 最长连续递增序列
The state cyberspace Office released the measures for data exit security assessment: 100000 information provided overseas needs to be declared
力扣 1037.有效的回旋镖