Android JNI的初步接触

javah -classpath (搜索类目录) -d (输出目录) (类名)
用于生成.h文件的命令

Android Studio的快捷配置
File ->Settings -> Tools -> External Tools

Argumnet:-classpath OutputPath -d cpp FileClass

注1:使用.h编译命令之前,需要生成.class文件,即Build->Make Project就行了

注2:一般在.h类的头文件里面只放入[函数声明],宏定义,函数原型,而具体的实现在.cpp文件里面,在编译的时候,编译器会自动加载和.h匹配的.CPP文件。

例如:使用javah命令将一个class文件转换为.h文件后(即将.java文件编译后生成的.class文件转为.h文件),.h文件中会生成对应的方法,后续需要一个.c或者.cpp文件实现,示例:

.java文件

 

Argumnet:-classpath OutputPath -d cpp FileClass

注1:使用.h编译命令之前,需要生成.class文件,即Build->Make Project就行了

注2:一般在.h类的头文件里面只放入[函数声明],宏定义,函数原型,而具体的实现在.cpp文件里面,在编译的时候,编译器会自动加载和.h匹配的.CPP文件。

例如:使用javah命令将一个class文件转换为.h文件后(即将.java文件编译后生成的.class文件转为.h文件),.h文件中会生成对应的方法,后续需要一个.c或者.cpp文件实现,示例:

.java文件

 public class TestJni {
    public native String dynamicLog();

    public native String staticLog();
}

使用ndk命令生成的.h文件

/* Header for class com_hao_world_intro_TestJni */

#ifndef _Included_com_hao_world_intro_TestJni
#define _Included_com_hao_world_intro_TestJni
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_hao_world_intro_TestJni
 * Method:    dynamicLog
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_hao_world_intro_TestJni_dynamicLog
  (JNIEnv *, jobject);

/*
 * Class:     com_hao_world_intro_TestJni
 * Method:    staticLog
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_hao_world_intro_TestJni_staticLog
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

此时.h文件相当于java中的抽象方法,需要在一个.c或.cpp文件中实现
即创建一个.cpp或者.c文件来实现

#include <jni.h>
#include <string>
#include "com_hao_world_intro_TestJni.h"

extern "C" {
JNIEXPORT jstring
JNICALL
Java_com_hao_world_intro_MainActivity_getString
        (JNIEnv *env, jobject) {
    std::string hello = "Hello ";
    return env->NewStringUTF(hello.c_str());
}

JNIEXPORT jstring
JNICALL
Java_com_hao_world_intro_TestJni_dynamicLog
        (JNIEnv *env, jobject) {
    std::string hello = "dynamicLog ";
    return env->NewStringUTF(hello.c_str());
} ;
}

注:extern "C"中的C是指C语言,如果是使用C++语言,此处应改为C++

最后一步,调用,在需要使用到这些C或C++的方法的时候,就只需要先加载c和cpp文件
java的加载方式:

static {
        System.loadLibrary("native-lib");
    }

kotlin的加载方式:

companion object {

        // Used to load the 'native-lib' library on application startup.
        init {
            System.loadLibrary("native-lib")
        }
    }

最后直接调用对应的方法就搞定。

 public class TestJni {
    public native String dynamicLog();

    public native String staticLog();
}

使用ndk命令生成的.h文件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值