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

posted @   飞航之梦  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示