日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

cmake java_JNI系列之AS支持CMake了

發布時間:2023/11/27 生活经验 60 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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了的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。