clion编译jni,找不到jni.h的解决办法
2021-12-28 本文已影响0人
100个大西瓜
在windows环境下生成的动态库是 dll
在linux下生成so
在mac下生成的是dylib
所以对于Android的开发者来说,还是要用ndk的工具
把在idea生成的.h文件粘贴到clion的项目中就可以了,
如果找不到jni.h可以在CMakeList.txt中添加对jni.h文件的引用
如下:
cmake_minimum_required(VERSION 3.0)
project(jni-c C)
set(CMAKE_C_STANDARD 99)
#add jdk-path
include_directories(C:/soft/jdk8/include)
include_directories(C:/soft/jdk8/include/win32)
include_directories(C:/soft/jdk8/include/win32/bridge)
后面三行根据jdk的实际位置填写,作用是导入jni相关的头文件;其他的操作系统可能不完全一致
复制.h头文件 com_shenby_jni_JniExample.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_shenby_jni_JniExample */
#ifndef _Included_com_shenby_jni_JniExample
#define _Included_com_shenby_jni_JniExample
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_shenby_jni_JniExample
* Method: getStringFromC
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_shenby_jni_JniExample_getStringFromC
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
实现该文件定义的函数 com_shenby_jni_JniExample.c
//
// Created by shenby on 2021/12/21.
//
#include <jni.h>
#include "com_shenby_jni_JniExample.h"
JNIEXPORT jstring JNICALL Java_com_shenby_jni_JniExample_getStringFromC
(JNIEnv *env, jobject jobj){
return (*env)->NewStringUTF(env,"string from c");
}
在CMakeList.txt中添加生成动态共项库
add_library(hello SHARED com_shenby_jni_JniExample.c)
add_library:生成一个库,add_executable:生成一个可执行文件
hello:是生成共享库的名字,前面会自动加上lib前缀,如这里windows生成的是 libhello.dll
SHARED:库的类型为动态,windows上生成.dll,而STATIC 则是生成静态库,windows生成.a文件
com_shenby_jni_JniExample.c :c源文件,多个文件就添加在后面,切记不能添加上面的com_shenby_jni_JniExample.h
文件,否则生成的库中的函数为空
结果如下
结果
就可以把该dll文件粘贴到idea的项目根目录中运行了