cmake java_JNI系列之AS支持CMake了
寫在前面
Android Studio 2.2+已支持CMake編譯,與以前NDK-Build方式相比方便了不少,本文旨在引導大家在AS2.2+下一步一步建立JNI工程進行開發,并假設大家已經對JNI相關知識有所了解,不作代碼解釋,文末附代碼GitHub地址。
AS更新之前進行JNI開發需要配置指定的Gradle版本(還是實驗版本),參見鏈接,相對應的HelloWorld工程已上傳,下載地址,本文拋開NDK-Build,使用最新的CMake工具鏈新建工程,大家各取所需。
開始分割線,嚴肅臉
建立工程
新建工程,勾選Include C++ Support
選擇Toolchain Default
Android視圖
Project視圖
0)HelloWorld
編寫JNIInterface.java
public class JNIInterface {
static {
// 庫名下文提及
System.loadLibrary("com_hayukleung_jni_JNIInterface");
}
public native String stringFromJNI();
}
為方便快速編寫JNIInterface對應的C頭文件,我寫了一個shell腳本,放置于工程根目錄,修改里面的路徑常量后,運行即可生成。
./jni_header_generator.sh com/hayukleung/jni/JNIInterface.java com.hayukleung.jni.JNIInterface
得到的C頭文件
/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* Header for class com_hayukleung_jni_JNIInterface */
#ifndef _Included_com_hayukleung_jni_JNIInterface
#define _Included_com_hayukleung_jni_JNIInterface
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_hayukleung_jni_JNIInterface
* Method: stringFromJNI
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_hayukleung_jni_JNIInterface_stringFromJNI
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
拷貝該頭文件,后綴改為.c或.cpp,實現函數Java_com_hayukleung_jni_JNIInterface_stringFromJNI
/* DO NOT EDIT THIS FILE - it is machine generated */
#include "com_hayukleung_jni_JNIInterface.h"
/* Header for class com_hayukleung_jni_JNIInterface */
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_hayukleung_jni_JNIInterface
* Method: stringFromJNI
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL
Java_com_hayukleung_jni_JNIInterface_stringFromJNI(JNIEnv *env, jobject obj) {
return (*env)->NewStringUTF(env, "JNIInterface-->HelloWorld");
}
#ifdef __cplusplus
}
#endif
打開CMakeLists.txt,將com_hayukleung_jni_JNIInterface.c文件路徑添加進去,生成的庫名建議與該文件一致,不至于與其它庫混淆
add_library( com_hayukleung_jni_JNIInterface // 生成的庫的庫名
SHARED
src/main/cpp/com_hayukleung_jni_JNIInterface.c ) // 路徑
寫個Activity展示這個字符串
public class CallbackActivity extends AppCompatActivity {
@Override protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView text = new TextView(this);
text.setText(new JNIInterface().stringFromJNI());
setContentView(text);
}
}
編譯,運行,結束。
1)JAVA調用C/C++函數
這里我們以一個斐波那契數列的計算為例子,使用C/C++編寫函數計算數列,JAVA端調用并顯示結果
不貼代碼了,文末附GitHub地址
2)C/C++調用JAVA方法
不貼代碼了,這里寫了三個JAVA方法供C調用,函數簽名如下
// 函數簽名:()V
void func();
// 函數簽名:(I)V
void func(int);
// 函數簽名:(Ljava/lang/String;)V
void func(String);
附錄
Java類型
對應的簽名
例子
boolean
Z
byte
B
char
C
short
S
int
I
long
L
float
F
double
D
void
V
Object
L用/分割包的完整類名;
Ljava/lang/String;
Array
[簽名
[I or [Ljava/lang/String;
總結
以上是生活随笔為你收集整理的cmake java_JNI系列之AS支持CMake了的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 发帖求教:英美人会不会把loser,lo
- 下一篇: java ee jsp程序_JavaEE