一个简单的JNI程序

网友投稿 1088 2022-10-14

一个简单的JNI程序

一个简单的JNI程序

NdkSoDemo

写一个简单的JNI程序

一、写在前面的话

1、AndroidStudio环境:

Android Studio 3.1.4Build #AI-173.4907809, built on July 24, 2018JRE: 1.8.0_152-release-1024-b01 x86_64JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.oMac OS X 10.13.6

2、-并配置好NDK (1)-NDK: 进入AndroidStudio的Preference的Android SDK的SDK tools, 勾选并-CMake、LLDB、NDK。 (2)在local.properties文件配置: ndk.dir=/Users/wanggang/Library/Android/sdk/ndk-bundle sdk.dir=/Users/wanggang/Library/Android/sdk

二、开始写一个简单的JNI程序

1、新建一个类JNIUtils

2、在主module的build.gradle文件里defaultConfig中配置ndk。

defaultConfig { //... ndk { moduleName "jniutil"//编译出so的名字 abiFilters 'x86', 'armeabi-v7a', 'x86_64' //输出指定abi体系结构下的so库。 } }

3、针对步骤1中的类JNIUtils,我们再执行Build-Make Project命令,完成后便生成字节码文件JNIUtils.class。 在NdkSoDemo/app/build/intermediates/classes/debug/com/wanggang/www/ndksodemo/JNIUtils.class中。

4、根据JNIUtils.class生成.h文件 (1)方法一 在AndroidStudio的terminal中执行:cd app/src/main/, 然后执行javah -d jni -classpath 编译后的class文件的绝对路径: javah -d jni -classpath /Users/wanggang/now/code/eclipse-workspace/NdkSoDemo/app/build/intermediates/classes/debug com.wanggang.ndksodemo.JNIUtils 结果在app/src/main/jni/目录下生成.h文件: com_wanggang_www_ndksodemo_JNIUtils.h (2)方法二 在AndroidStudio的terminal中执行:cd app/build/intermediates/classes/debug/, 然后执行javah com.wanggang.ndksodemo.JNIUtils, 结果在app/build/intermediates/classes/debug/目录下生成.h文件: com_wanggang_www_ndksodemo_JNIUtils.h 最后将该.h文件copy到app/src/main/jni/目录下。

5、编写.c文件(jniutil.c) 在app/src/main/jni/目录下创建jniutil.c文件,并实现其方法:

#include "com_wanggang_www_ndksodemo_JNIUtils.h"JNIEXPORT jstring JNICALL Java_com_wanggang_www_ndksodemo_JNIUtils_test (JNIEnv *env, jobject obj) { return (*env)->NewStringUTF(env, "jni调用成功");}

6、在MainActivity中调用

public class MainActivity extends AppCompatActivity { private TextView ndk_txt; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ndk_txt = findViewById(R.id.ndk_txt); ndk_txt.setText(new JNIUtils().test()); }}

7、创建编译文件Android.mk

在app/src/main/jni/目录下创建Android.mk文件:LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := jniutilLOCAL_SRC_FILES := jniutil.cinclude $(BUILD_SHARED_LIBRARY)

8、在主module的build.gradle文件里android中配置ndkBuild路径:

externalNativeBuild{ ndkBuild{ path file("src/main/jni/Android.mk") } }

三、如何在AndroidStudio中输出JNI log?

1、在app/build.gradle中添加ldLibs "log"

android { defaultConfig { ndk { ldLibs "log" moduleName "jniutil"//编译出so的名字 abiFilters 'x86', 'armeabi-v7a', 'x86_64' //输出指定abi体系结构下的so库。 } }}

2、在Android.mk中添加:

LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog

3、添加头文件iqiyi_child_log.h

//// Created by wanggang on 2018/9/8.//#ifndef NDKSODEMO_IQIYI_CHILD_LOG_H#define NDKSODEMO_IQIYI_CHILD_LOG_H#ifdef __cplusplusextern "C" {#endif#include // 宏定义类似java 层的定义,不同级别的Log LOGI, LOGD, LOGW, LOGE, LOGF。 对就Java中的 Log.i log.d#define LOG_TAG "JNILOG_WANGGANG" // 这个是自定义的LOG的标识//#undef LOG // 取消默认的LOG#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG, __VA_ARGS__)#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG, __VA_ARGS__)#define LOGW(...) __android_log_print(ANDROID_LOG_WARN,LOG_TAG, __VA_ARGS__)#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG, __VA_ARGS__)#define LOGF(...) __android_log_print(ANDROID_LOG_FATAL,LOG_TAG, __VA_ARGS__)#ifdef __cplusplus}#endif#endif //NDKSODEMO_IQIYI_CHILD_LOG_H

4、使用JNI LOG

#include "com_wanggang_www_ndksodemo_JNIUtils.h"#include "iqiyi_child_log.h"JNIEXPORT jstring JNICALL Java_com_wanggang_www_ndksodemo_JNIUtils_test (JNIEnv *env, jobject obj) { LOGI("jni log"); return (*env)->NewStringUTF(env, "jni demo --- invoke success");}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:struts2__Action配置的各项默认值
下一篇:SpringAOP实现日志收集管理功能(步骤详解)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~