java jni日志输出_基于 Android NDK 的学习之旅-----JNI LOG 打印

下面我介绍下JNI层的log打印方法的使用,类似与Android sdk提供的log

1、Android 应用层 MainActivity.java

主要功能代码

a)        静态载入 So 库

b)       声明本地方法

c)        调用本地方法

代码附有注释如下:

public classMainActivity extends Activity {

//也就是你mk配置文件中的  LOCAL_MODULE    := NDK_02

private static final String libSoName ="NDK_02";

private Context mContext = null;

private Button btnClick = null;

private String mStrMSG = null;

private EditText etContext = null;/** Called when the activity is firstcreated. */@Overridepublic void onCreate(BundlesavedInstanceState) {    super.onCreate(savedInstanceState);

setContentView(R.layout.main);

mContext = this;

etContext =(EditText)findViewById(R.id.et_content);

btnClick = (Button) findViewById(R.id.btn_click);

btnClick.setOnClickListener(newOnClickListener() {

public void onClick(View v) {

mStrMSG =setParamToJNI(getContent());                  if(mStrMSG == null) {

mStrMSG = "调用JNI失败";

}

LogUtils.toastMessage(mContext,mStrMSG);

}

});

}/**

* 获取输入框内容

* @return 输入框内容

*/private String getContent() {

Stringstr = etContext.getText().toString();

returnstr.trim().length() > 0 ? str:"default value";

}/**

* 该方法为native方法.

*

*    由C实现

*

* @return

*/public native String  setParamToJNI(String msg);/**

* 载入JNI生成的so库文件

*/static {

System.loadLibrary(libSoName);

}

2、Android.mk 文件的配置

之前有介绍过相关的内容,如果对配置有不清晰的地方请阅读 Android.mk 文件 简介

LOCAL_PATH :=$(call my-dir)

include$(CLEAR_VARS)

LOCAL_C_INCLUDES:= $(LOCAL_PATH)/include

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

LOCAL_MODULE    := NDK_02

LOCAL_SRC_FILES:= \

PrintLog.c

include$(BUILD_SHARED_LIBRARY)

要打印log 必须添加

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

3、JNI层PrintLog.c文件的实现

include

include

include

jstringJava_com_duicky_MainActivity_setParamToJNI(JNIEnv* env, jobject thiz,jstringmsg)

{if(msg == NULL) {          //该方法为打印的方法

__android_log_print(ANDROID_LOG_INFO, "JNIMsg","Your params is null");          return(*env)->NewStringUTF(env, "Your params is null");

}

chardata[128];   memset(data,0, sizeof(data));   char*c_msg = NULL;

c_msg= (*env)->GetStringUTFChars(env, msg, 0);   //该方法为打印的方法

__android_log_print(ANDROID_LOG_INFO,"JNIMsg", "Get Param:  %s From Java", c_msg);   return(*env)->NewStringUTF(env, "success");

}

i、              必须引用头文件#include

ii、            __android_log_print(ANDROID_LOG_INFO,"JNIMsg", " Log Content ");

JNIMsg 为 你想输出到的过滤标签

Log Content 为你 想输出的相关信息,用法与C的Printf一样

4、运行程序

输入内容

AAffA0nNPuCLAAAAAElFTkSuQmCC

点击发送

查看控制台打印信息

AAffA0nNPuCLAAAAAElFTkSuQmCC

作者:Android高级架构探索

链接:https://www.jianshu.com/p/8e6ec09e87c4

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于您的问题,我会尽力回答。在Android中,JNI可以用来与C/C++代码进行交互,我们可以利用JNI来读写SD卡。下面是一个简单的例子: 1. 首先,在您的Java代码中定义native方法: ``` public class MainActivity extends Activity { static { System.loadLibrary("native-lib"); } public native String readFromSDCard(String filePath); public native boolean writeToSDCard(String filePath, String content); } ``` 2. 然后,在您的C/C++代码中实现这些方法: ``` #include <jni.h> #include <string.h> #include <stdio.h> #include <android/log.h> JNIEXPORT jstring JNICALL Java_com_example_myapplication_MainActivity_readFromSDCard(JNIEnv *env, jobject instance, jstring filePath) { const char *path = env->GetStringUTFChars(filePath, 0); FILE *file = fopen(path, "r"); if (file == NULL) { __android_log_print(ANDROID_LOG_ERROR, "JNI", "readFromSDCard: fopen failed"); return NULL; } fseek(file, 0, SEEK_END); long size = ftell(file); fseek(file, 0, SEEK_SET); char *buffer = new char[size + 1]; fread(buffer, 1, size, file); buffer[size] = '\0'; fclose(file); env->ReleaseStringUTFChars(filePath, path); return env->NewStringUTF(buffer); } JNIEXPORT jboolean JNICALL Java_com_example_myapplication_MainActivity_writeToSDCard(JNIEnv *env, jobject instance, jstring filePath, jstring content) { const char *path = env->GetStringUTFChars(filePath, 0); const char *str = env->GetStringUTFChars(content, 0); FILE *file = fopen(path, "w"); if (file == NULL) { __android_log_print(ANDROID_LOG_ERROR, "JNI", "writeToSDCard: fopen failed"); return false; } fwrite(str, 1, strlen(str), file); fclose(file); env->ReleaseStringUTFChars(filePath, path); env->ReleaseStringUTFChars(content, str); return true; } ``` 3. 最后,在您的AndroidManifest.xml文件中添加以下权限: ``` <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> ``` 这样,您就可以在Java代码中调用这些native方法来读写SD卡了。 至于Android NDK的使用实例——增量更新实战,这是一个比较复杂的话题,如果您有相关的需求,可以提出具体的问题,我会尽力为您解答。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值