安卓使用JNI输出字符和LOG输出

安卓NDK环境就不多说了,已经出来很久的东西,各大搜索引擎不是盖的,尽情使用即可


1 编写java代码



package com.example.jni_test2;

public class HelloJni {

	public native int getIntegerData();
	public native String getStringData();
	
	static{
		System.loadLibrary("com-hello");	
	}
	
}


2 使用javah命令生成.h头文件


1进入到字节码目录




2 使用javah命令生成c/c++ 头文件



这样就是classes目录下生成头文件了



3 建立jni目录

在项目目录下新建jni文件夹,并且拷贝Android.mk文件和刚生成的h头文件到该目录下,新建c/cpp文件实现头文件的接口




4完成C代码的实现


Android.mk如下

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := com-hello
LOCAL_SRC_FILES := com_example_jni_test2_HelloJni.cpp

LOCAL_LDLIBS :=-llog

include $(BUILD_SHARED_LIBRARY)

上面的LOCAL_LDLIBS :=-llog是打印Log必须配置的



c/cpp文件

#include<jni.h>
#include<stdio.h>
#include<stdlib.h>
#include <android/log.h>
#include  "com_example_jni_test2_HelloJni.h"//C文件的话,不用这句,CPP一定要


#define TAG "tagDemo-jni" // 这个是自定义的LOG的标识
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,TAG ,__VA_ARGS__) // 定义LOGD类型
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,TAG ,__VA_ARGS__) // 定义LOGI类型
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN,TAG ,__VA_ARGS__) // 定义LOGW类型
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,TAG ,__VA_ARGS__) // 定义LOGE类型
#define LOGF(...) __android_log_print(ANDROID_LOG_FATAL,TAG ,__VA_ARGS__) // 定义LOGF类型

JNIEXPORT jint JNICALL Java_com_example_jni_1test2_HelloJni_getIntegerData(
		JNIEnv * env, jobject obj) {
		int i = 13579;
	     LOGD("##########D-- i = %d", i);
	     LOGI("########## I--i = %d", i);
	     LOGW("########## W--i = %d", i);
	     LOGE("########## E--i = %d", i);
	     LOGF("########## F--i = %d", i);

	return 10086;
}

JNIEXPORT jstring JNICALL Java_com_example_jni_1test2_HelloJni_getStringData(
		JNIEnv * env, jobject obj) {
	 */
	 //C语言
	// jstring   result   =   (*env)->NewStringUTF(env,"Hello C语言 ");//C语言使用
	//CPP实现方法如下
	jstring result = env->NewStringUTF("Hello JNI CPP 文件 测试");
	return result;

}


其中的一些宏在代码中可能找不到,因为不在代码中

只有支持C99规范的gcc编译器才有__VA_ARGS__这个宏,如果不是gcc编译器......就,,,,,


5 创建so库

使用NDK生成库



生成了库,生成了文件如下




6回归安卓中调用


package com.example.jni_test2;

public class HelloJni {

	public native int getIntegerData();
	public native String getStringData();
	
	static{
		System.loadLibrary("com-hello");	
	}
	
}
这里的System.loadLibrary("com-hello");是在Android.mk文件中定义的库名字

LOCAL_MODULE    := com-hello


7 运行安卓程序





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值