javah -classpath (搜索类目录) -d (输出目录) (类名)
用于生成.h文件的命令
Android Studio的快捷配置
File ->Settings -> Tools -> External Tools

Argumnet:-classpath -d cpp
注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")
}
}
最后直接调用对应的方法就搞定。
网友评论