• 保存到桌面  加入收藏  设为首页
安卓框架层

安卓-JNI基本用法及注意事项

时间:2016-10-24 21:05:57   作者:江节胜   来源:胜行天下   阅读:446   评论:0

 
基本顺序:
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


标签:安卓  JNI  
上一篇:没有了
下一篇:没有了
相关评论

加我微信 596957738 (QQ同号)加我微信     QQ联系:596957738    地址:江苏省南京市浦口区

苏ICP备2023050353号

   

苏公网安备32011402010305号

江节胜的Gitee,江节胜的Git地址