JNI入门----(一)
一,基本介绍
所谓的JNI 就是java Native Interface 意思就是java的本地接口,因为我们的程序的底层是linux,使用C/C++写的,java应用层是无法直接调用底层的东西,于是就是提供了一个接口,让我们可以调用C语言函数的接口。这就是JNI。
二,基本实现
####java代码部分
//这是最简单的一个jni小例子
public class MainActivity extends Activity {
static{
System.loadLibrary("hello");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void click(View v){
//System.loadLibrary("hello");
String result = hello_FromC();
Toast.makeText(getApplicationContext(), result, 0).show();
}
//声明本地方法 使用native关键字 本地方法不用实现
public native String hello_FromC();
}
//分析第一个部分 这里的System.loadLibrary(“hello”);
static{
System.loadLibrary(“hello”);
}
//这个表示加载一个名为hello的库,注意,这里的hello库实际上就是 .so库的名字
但是有人可能觉的蛮奇怪,因为.so库中只有一个 libhello.so,实际上我们的这个hello的前缀和后缀都是编译的时候帮我们加上去的。
//分析第二个部分 这里的public native String hello_FromC();
public native String hello_FromC();
//这个表示定义一个本地方法,其实在这里就是一个调用C语言的方法,前面用native关键字来修饰,方法体在这里不用实现,我们可以理解为一个抽象的方法返回的是一个字符串类型
————————————————————————————
1,首先我们在main的目录下创建一个jni的文件夹和java文件夹同级。
2,在这个文件夹下面我们创建一个名为hello.c的文件,用来编写C语言的程序。
#include <stdlib.h>
#include <stdio.h>
#include <jni.h>
//jstring
//Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
// jobject thiz )
//JNIEnv* env 是结构体JNINativeInterface 的二级指针
// JNIEnv 是结构体JNINativeInterface 的一级指针
// JNINativeInterface结构体中定义了大量的函数指针 这些函数指针在jni开发中很常用
// (*env)->
//jobject 调用本地函数的java对象 在这个例子中 就是MainActivity的实例
//c本地函数命名规则 Java_包名_类名_本地方法名
//jstring (*NewStringUTF)(JNIEnv*, const char*);
jstring Java_com_itheima_jnihello_MainActivity_hello_1FromC(JNIEnv* env,jobject thiz){
char* cstr = "hello from c!";
return (*env)->NewStringUTF(env,cstr);
}
3,jni的目录下面建一个Android.mk的文件
makefile 告诉编译器.c的源文件在什么地方,要生成的编译对象的名字是什么
在这个文件中写入
ruby
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello //表示目标文件名字,也就是.so文件的名字(这里注意)
LOCAL_SRC_FILES := hello.c //源文件的名字
include $(BUILD_SHARED_LIBRARY)
4调用ndk-build编译c代码生成动态链接库.so文件 文件的位置 lib->armeabi->.so
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)