A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 大山哥哥 黑马粉丝团   /  2017-7-27 19:03  /  1556 人查看  /  1 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

java调用C步骤

第一步,写java代码,,写一个natvie方法
   
    public native String getServerInfo(String path);



第二步。创建jni目录,在目录中创建test.c文件,同时将jni.h文件 放入jni目录

写c代码,注意方法名,并且引入jni.h

    #include <jni.h>
    #include <stdio.h>

    jstring Java_com_example_untitled_MyActivity_getServerInfo(JNIEnv* env, jobject thiz, jstring path) {

        写方法。。。
    }

注意:方法名的写法如下

    Java_包名_类型_方法名(jvm虚拟机的指针,调用者对象)


这里生成方法名也可以通过ndk来实现的分为2步

* 通过dos命令使用javac -d . Test.java 命令编译带有native方法的.java文件,这样就会在当前目录中生成一个class文件

        会生成com/b3a4a/jnitest/Test.class
* 通过javah命令来生成  例如 javah com.b3a4a.jnitest.Test,会生成.h的头文件
        
        生成 com_b3a4a_jnitest_Test.h 文件,方法名就在.h头文件中

        JNIEXPORT jstring JNICALL Java_com_b3a4a_jnitest_Test_getServerInfo
          (JNIEnv *, jobject);

第三步,在jni目录中创建文件,andorid.mk

    LOCAL_PATH := $(call my-dir)
   
    include $(CLEAR_VARS)
   
    LOCAL_MODULE    := test
    LOCAL_SRC_FILES := test.c
   
    LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
    LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog
   
    include $(BUILD_SHARED_LIBRARY)


第四步,进入命令行,进入应用程序的包的目录,执行ndk-build命令,创建Application.mk,自己填写需要的处理器型号,生成不同的so文件

    APP_ABI := armeabi armeabi-v7a x86

第五步,将生成的libtest.so 放入lib/armeabi目录(目录不需要自己建)




第六步,java代码里面,把动态链接库加载到jvm虚拟机
        static{
            System.loadLibrary("库文件名称不带前缀,后缀名");
        }


第7步,java中直接调用native方法



JNI开发的常见错误
1. 写错了load的library

        java.lang.UnsatisfiedLinkError: Couldn't load hell0: findLibrary returned null

2. Android.mk文件编写错误

        /jni/Android.mk:4: *** missing separator.  Stop.

3. LOCAL_MODULE配置不能有扩展名

        //jni/Android.mk:hello.so: LOCAL_MODULE_FILENAME must not contain a file extension

4. c或者c++的源文件名称配置错误
        objs/hello/helo.o'.  Stop.
5. 如果使用了错误的cpu平台
        java.lang.UnsatisfiedLinkError: Couldn't load hello: findLibrary returned null
        添加多cpu平台的支持 APP_ABI := armeabi armeabi-v7a x86

6. c语言方法名称错误,导致java代码无法寻找到c代码
        Caused by: java.lang.UnsatisfiedLinkError: Native method not found: com.itheima.hellojni.MainActivity.helloFromC:()Ljava/lang/String;
   
7. 应用程序闪退
        06-25 07:31:46.698: I/dalvikvm(1871):   #00  pc 0008ee6d  /system/lib/libdvm.so
        06-25 07:31:46.698: I/dalvikvm(1871):   #01  pc 000738ca  /system/lib/libdvm.so
        06-25 07:31:46.698: I/dalvikvm(1871):   #02  pc 000739f4  /system/lib/libdvm.so
        06-25 07:31:46.698: I/dalvikvm(1871):   #03  pc 00038f5b  /system/lib/libdvm.so
        06-25 07:31:46.698: I/dalvikvm(1871):   #04  pc 0003bdbd  /system/lib/libdvm.so
    要么就是c代码有逻辑错误
    要么编码问题,中文或者空格路径

1 个回复

倒序浏览

回帖奖励 +1

感谢分享
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马