Jni第一个案例
2021-10-17 本文已影响0人
大旺旺的弟弟小旺旺
显示一句话
- cmakelist.txt文件的解释。
#使用的版本
cmake_minimum_required(VERSION 3.10.2)
#项目名称
project("ndkdemo")
#编译出的so库的名称
set(libname javacallc) #编译之后的名字 不一样要和文件名相同
#增加的头 也可以理解为找头文件的位置
add_library( # Sets the name of the library.
javacallc
SHARED
utils/LogUtils.cpp
utils/LogUtils.h
handler/Handler01.cpp
handler/Handler01.h
Sample01/Sample01.cpp
Sample01/Sample01.h
native.cpp)
find_library(
log-lib
log )
#编译那些东西
target_link_libraries( # Specifies the target library.
javacallc
${log-lib} )
- 输出一句话
extern "C" jstring Java_com_kangwang_javacallc_Demo01_stringFromJNI(JNIEnv *env, jobject thiz) {
// TODO: implement stringFromJNI()
Sample01 *sample01 = new Sample01(env);
return sample01->getInfo();
}
- 调用
static {
System.loadLibrary("javacallc");
}
public void printMsg(){
System.out.println(stringFromJNI());
}
public native String stringFromJNI();
分析
jni参数说明
- extern "C":使用c
- jstring:返回值
- Java_com_kangwang_javacallc_Demo01_stringFromJNI
class _jstring : public _jobject {};
typedef _jstring* jstring;
可以看到jstring的父类是_jstring*,_string的类型是jobject;
常用类型操作
- 字符串jstring
std::string hello = "Hel";
return env1->NewStringUTF(hello.c_str());
- 数组操作
java代码,传入int数组和string数组
public native void arrTest(int arr[],String[] str);
jni代码
extern "C"
JNIEXPORT void JNICALL
Java_com_kangwang_javacallc_Demo01_arrTest(JNIEnv *env, jobject thiz, jintArray arr,
jobjectArray str) {
// TODO: implement arrTest()
}
实现
// TODO: implement arrTest()
//得到第一个数据的位置
jint *intarr = env->GetIntArrayElements(arr, NULL);
int arrlenght = env->GetArrayLength(arr);
for (int i = 0;i<arrlenght ;i++){
LOGI(*(intarr+i));
}
//第三个 model
// 0:刷新java数组 并释放c/c++
// 1:只刷新java数组
// 2:只是释放
env->ReleaseIntArrayElements(arr,intarr,0);
//定义类型
int strLength = env->GetArrayLength(str);
for (int i = 0; i <strLength; ++i) {
jstring ss = static_cast<jstring>(env->GetObjectArrayElement(str, 0));
const char* chara = env->GetStringUTFChars(ss,0);
env->ReleaseStringUTFChars(ss, chara);
}
数据分为基本数据类型和定义数据类型
typedef _jobject* jobject;
typedef _jclass* jclass;
typedef _jstring* jstring;
typedef _jarray* jarray;
typedef _jobjectArray* jobjectArray;
typedef _jbooleanArray* jbooleanArray;
typedef _jbyteArray* jbyteArray;
typedef _jcharArray* jcharArray;
typedef _jshortArray* jshortArray;
typedef _jintArray* jintArray;
typedef _jlongArray* jlongArray;
typedef _jfloatArray* jfloatArray;
typedef _jdoubleArray* jdoubleArray;
typedef _jthrowable* jthrowable;
typedef _jobject* jweak;
基本数据类型加j,