基本顺序:
1、java代码中 private native void add();
2、新建jni文件夹,新建hello.c文件夹
3、添加头文件
#include
#include
#include
4、c文件方法命名 (返回类型 方法名(环境变量指针,对象,自定义参数1,自定义参数2)){
}
jstring Java_包名_类名_方法名 (JNIEnv* env, jobject obj,xxx1,xxx2){ }
(方法名生成方法(针对java中的方法名含有很多的"_"的情况,使用指令生成)
java 1.7中,到java项目的src文件夹下,打开cmd,javah 包名.类名,回车
java 1.6中,到java项目的bin/classes/文件夹下 执行上述命令,
文件夹上会生成文件,复制出其中需要的文件)
5、按照jni.h 中的类型,写出方法体
jni.h 见附件
6、创建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_mode
LOCAL_SRC_FILES := 你的.c文件,多个文件用 \ 分割
include $(BUILD_SHARED_LIBRARY)
单个文件:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello
LOCAL_SRC_FILES := hello.c
include $(BUILD_SHARED_LIBRARY)(待确定)
7、到jni文件下,打开cmd,执行ndk-build.cmd 命令,libs自动生成so文件。
多平台自动生成:创建Application.mk ,粘贴代码 APP_ABI := armeabi armeabi-v7a
x86 (更多见百度)
8、java代码中 在静态程序块中 static{
System.loadLibrary("hello");
}
注意事项:
1、关联NDK源码:Windows-Android-NDK-添加NDK的根路径(不添加也行)
项目右击 Andriod Tools-Add Native Support ,输入包名,然后自动创建app和mk文件,并打
开
C/C++的开发界面(重写修改cpp,改为c)。这时候不能删除jni文件夹(会直接出错)。
2、c开发页面出现警告:项目右击-properties-C/C++ General- Paths and Symbols - Add-
File System-NDK文件下-platform-android-xx -arch-arm(或其他平台) -usr-include文件夹。
(然后接可以执行Alt / 快捷键,不能自动补全参数,可以直接点进去看)
直接使用别人的so库,注意不是“change包名”。
自动生成so类库,好像要先在代码中写在加载system.loadlibriy
javap -s 生成内部签名 在bin/classes/src下执行。
双击devices,切换logcat
jstring 转 char *:
char* Jstring2CStr(JNIEnv* env, jstring jstr)
{
char* rtn = NULL;
jclass clsstring = (*env)->FindClass(env,"java/lang/String");
jstring strencode = (*env)->NewStringUTF(env,"GB2312");
jmethodID mid = (*env)->GetMethodID(env,clsstring, "getBytes",
"(Ljava/lang/String;)[B");
jbyteArray barr= (jbyteArray)(*env)->CallObjectMethod
(env,jstr,mid,strencode); // String .getByte("GB2312");
jsize alen = (*env)->GetArrayLength(env,barr);
jbyte* ba = (*env)->GetByteArrayElements(env,barr,JNI_FALSE);
if(alen > 0)
{
rtn = (char*)malloc(alen+1); //"\0"
memcpy(rtn,ba,alen);
rtn[alen]=0;
}
(*env)->ReleaseByteArrayElements(env,barr,ba,0); //
return rtn;
}
注意C也有也要注意中英文编码.
有任何疑问或技术合作都可联系我
微信:yanfahezuo 【推荐】
QQ:596957738