Android(安卓)JNI之动态创建native
16lz
2021-01-26
Android JNI之动态创建native
1、环境配置
1)确定android studio里安装了ndk,可以按照下面的图查看。
2)系统环境变量配置,根据自己电脑路径配置
2、动态创建native
1)新建一个android studio工程,然后在gradle.properties里增加如下语句。
2)在MainActivity平级目录下新建一java文件,内容如下:
package com.example.myjnidemotest2;public class JniUtils { static{ System.loadLibrary("native-lib"); } public static native String getStringFromJni(); public static native int getAddResultFromJni(int a, int b);}
3) 在main下面新建jni目录
4)在jni目录下新建三个文件,一个cpp文件,两个mk文件。 cpp文件是实现具体功能的,是用C++实现的。
cpp文件内容
#include #include #include#include using namespace std;#ifdef __cplusplusextern "C" {#endifstatic const char *className = "com/example/myjnidemotest2/JniUtils";JNIEXPORT jstring JNICALL JniSay(JNIEnv *env, jobject obj) { return env->NewStringUTF("Hello From JNI!!!");}JNIEXPORT jint JNICALL addInJni(JNIEnv *env, jobject obj, jint a, jint b) { return a + b;}static JNINativeMethod gJni_Methods_table[] = { {"getStringFromJni", "()Ljava/lang/String;", (void*)JniSay}, {"getAddResultFromJni", "(II)I", (void*)addInJni},};JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved){ JNIEnv* env = NULL; jint result = -1; if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) { return result; } jclass clazz = (env)->FindClass( className); if (clazz == NULL){ return -1; } if ((env)->RegisterNatives(clazz, gJni_Methods_table, sizeof(gJni_Methods_table) / sizeof(gJni_Methods_table[0])) < 0) { return -1; } return JNI_VERSION_1_4;}#ifdef __cplusplus}#endif
Android.mk文件内容
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := native-libLOCAL_SRC_FILES := ImplementFuns.cppinclude $(BUILD_SHARED_LIBRARY)
Application.mk文件内容
APP_ABI := all
5)在app的build.gradle里增加如下内容
6)调用JNI接口,我是在MainActivity里调用的。
package com.example.myjnidemotest2;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.d("wujiang", "from jni str = " + JniUtils.getStringFromJni()); Log.d("wujiang", "a + b = " + JniUtils.getAddResultFromJni(4, 9)); }}
7)编译运行就ok了,我的运行结果
THE END
更多相关文章
- 【Android(安卓)Developers Training】 36. 设置文件共享
- android动态加载外部资源文件
- Android(安卓)Studio 教程(干货)
- Android(安卓)7.0的新特性
- adb and App
- Android高级的总结
- Windows下,Ant自动化编译Android项目具体步骤和方法
- Android(安卓)SDK 实例代码分析---Accelerometer Play(一)
- Android(安卓)Studio中生成aar之包括*.jar,*.aar和*.so文件