安卓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必须配置的
#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 运行安卓程序