Android JNI的基本使用(CMake)
#使用流程
1、在java檔案中建立本地方法
2、build專案後自動生成“.h”檔案
3、建立.cpp檔案,實現.h檔案中的方法
4、配置Cmake檔案,生成“.so”檔案
筆者專案目錄如下:
##測試例項
public class MyJNI {
private static final String TAG=MyJNI.class.getName();
@Test
public void test(){
JNITest jniTest=new JNITest();
Log.d(TAG,jniTest.nativeCalculate(2)+"");
}
}
1、呼叫native方法nativeCalculate,傳入引數2。
1、獲取java物件number,初始值為0。
2、呼叫java方法javajavaCalculate,傳入number值,獲得返回值10。
3、將返回值加上引數2,返回,獲得12。
最終效果如下:
#建立本地方法
public class JNITest {
private int number = 0;
public int javaCalculate(int num){
number=num+10;
return number;
}
public native int nativeCalculate(int num);
static {
System.loadLibrary("jni_test");
}
}
#自動生成“.h檔案”
首先make Project,然後進入到app\build\intermediates\classes\debug目錄下。
在終端輸入命令javah com.example.xujiajia_sx.jnitest.JNITest(即帶有native方法的類)
效果如下:
自動生成的“.h”檔案如下,可以根據自己要求對其重新命名或者增減內容。
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_xujiajia_sx_jnitest_JNITest */
#ifndef _Included_com_example_xujiajia_sx_jnitest_JNITest
#define _Included_com_example_xujiajia_sx_jnitest_JNITest
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_example_xujiajia_sx_jnitest_JNITest
* Method: nativeCalculate
* Signature: (I)I
*/
JNIEXPORT jint JNICALL Java_com_example_xujiajia_1sx_jnitest_JNITest_nativeCalculate
(JNIEnv *, jobject, jint);
#ifdef __cplusplus
}
#endif
#endif
#建立cpp檔案實現native方法
筆者cpp檔案如下:
#include "jni_test.h"
JNIEXPORT jint JNICALL
Java_com_example_xujiajia_1sx_jnitest_JNITest_nativeCalculate(JNIEnv *env, jobject obj,jint num) {
//獲取obj中物件的class物件
jclass clazz = env->GetObjectClass(obj);
//獲取clazz中的number欄位的id
jfieldID id_number = env->GetFieldID(clazz, "number", "I");
jmethodID id_java_calculate=env->GetMethodID(clazz, "javaCalculate", "(I)I");
//次獲取java中number的值
jint number = env->GetIntField(obj, id_number);
jint result=env->CallIntMethod(obj,id_java_calculate,number);
env->SetIntField(obj,id_number,result+num);
//再次獲取java中number的值並返回
return env->GetIntField(obj, id_number);
}
主要邏輯是獲取到java中number的值,然後呼叫javaCalculate()方法,接著再加上這個native方法的引數num。
#設定Cmake檔案,生成".so"檔案
首先,在build.gradle中新增Cmake配置:
android {
...
defaultConfig {
...
externalNativeBuild {
cmake {
cppFlags ""
//生成多個版本的so檔案
abiFilters 'armeabi','armeabi-v7a','x86'
}
}
}
buildTypes {
...
}
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
}
編寫Cmake檔案:
#CMakeLists.txt
cmake_minimum_required(VERSION 3.4.1)
add_library( # Sets the name of the library.
jni_test
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
src/main/jni/jni_test.cpp)
include_directories(src/main/jni/)
find_library( # Sets the name of the path variable.
log-lib
# Specifies the name of the NDK library that
# you want CMake to locate.
log )
target_link_libraries( # Specifies the target library.
# 制定目標庫.
jni_test
# Links the target library to the log library
# included in the NDK.
${log-lib} )
配置完cmake,rebuild專案,即可以執行test。“.so”檔案生成如下:
相關文章
- 使用CMake構建Android JNI工程Android
- cmake + JNI
- Android NDK祕籍--初識NDK、JNI、Makefile/CMakeAndroid
- 【CMake】掌握CMake基本操作
- Android Studio中jni的使用Android
- 在 Android 中使用 JNI 的總結Android
- Android Framework層JNI的使用淺析AndroidFramework
- C中的基本輸入輸出函式(Android之JNI)函式Android
- android使用JNI呼叫C,C++程式AndroidC++
- android: jni socketAndroid
- Android Button的基本使用Android
- 使用CMake命令編譯Android平臺下的包編譯Android
- CMake 使用
- Android JNI原理分析Android
- Android studio jniAndroid
- CMAKE的使用詳解
- cmake的使用總結
- cmake的使用(cmake不是內部或外部命令)
- Android PopUpWindow基本使用Android
- Android Studio1.4.x JNI開發基礎-基本環境配置Android
- C的指標(Android之JNI)指標Android
- Android NDK開發掃盲及最新CMake的編譯使用Android編譯
- Android JNI 之 Bitmap 操作Android
- CMake的安裝和使用
- Android JNI 中的執行緒操作Android執行緒
- Android中的JNI入門實戰Android
- Cygwin的安裝及在Android jni中的簡單使用舉例Android
- Android Volley 基本使用Android
- cmake中使用proto
- CMake中使用vcpkg
- cmake使用說明
- Android Jetpack(2):DataBinding的基本使用AndroidJetpack
- Android基礎-Activity基本使用Android
- Android Jetpack Navigation基本使用AndroidJetpackNavigation
- cmake使用教程(一)-起步
- Android JNI開發系列之配置Android
- Android系統原始碼分析-JNIAndroid原始碼
- Android Studio jni - 入門篇Android