JNI

2019-11-24

JNI读取文件:

首先要申请权限

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

然后,JNI的默认路径是/,根目录一般都是没有权限,你一般要用存储卡路径,比如我的手机是 /storage/emulated/0/new.txt

2019-11-25

之前得出的结论是JNI不能fork出子进程,当前得出这个结论是因为debug没有进子进程。

今天突发奇想,我在子线程里面创建文件,发现真的创建了,原来JNI是支持fork的,只是debug没有进去而以。

2019-12-14

说2点。

jni进行socket编程,是需要安卓网络权限的。好奇宝宝,不知道安卓是怎么实现的??感觉linux好像没有网络权限的说法的吧。

其一,犯的是java上的错,本来我用的是bufferedWriter去write的,然后居然调的是OutputStream的flush,居然没生效,浪费了我好多时间。以后切记,高层的wirte要调用高层的flush

2019-12-15

c语言 socket write之后,数据在缓冲区里,并没有发出去,我再调一次,就把前面的推送出去了。

    char *req = "GET http://kan.2345.com/ HTTP/1.1\r\n\r\n";
    int k = write(cfd, req, strlen(req));
    int k2 = write(cfd, req, strlen(req));

想找一个flush方法,一直没有找到,或者想要一个没缓存的设置。没成功,

后杰找书本,有一句

  int on = 1;
  setsockopt(cfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));

试一下,真的成了。这句话书中说是“快速回收socket”,感觉这个说明应该和 flush没关吧,不过对我来说有效果。

2019-12-22

    int k = 90;
    //__android_log_print(4, "##############", "年龄:" + 90); 报错,编译不通过
    __android_log_print(4, "##############", "年龄:%d", k);

2021-08-08

在src目录下,打开cmd,执行javah -jni cn.angelshelter.example.jni.JNITest

可以生成头文件,最后面参数是类的限定路径(Qualified Name)。

JNI方法描述符

一般可以通过文本编辑器打开class找到(虽然是乱码,就看不是乱码的部分)

比如main的JNI方法描述符是([Ljava/lang/String;)V

学习jni.h建议看c++版本的(就是下翻一下就找到了),

举例:

c语言版: jclass  (*DefineClass)(JNIEnv*,  const char*,  jobject,  const jbyte*,  jsize);      //jobject是什么参数??

c++语言版:jclass  DefineClass(const char *name,  object loader,  const jbyte* buf,  jsize bufLen)     //从命名看object 是需要传类加载器对象。ClassLoader

还有

c语言版: jobject     (*ToReflectedMethod)(JNIEnv*, jclass, jmethodID, jboolean);    //最后一个boolean不知道干嘛的

c++语言版: jobject ToReflectedMethod(jclass cls, jmethodID methodID, jboolean isStatic)   //顾名思义, 就是表示是不是静态的

加载lib文件

  static {
        System.loadLibrary("hello");//方式1,不带路径和扩展名
      //System.load("/Users/yangxin/Desktop/libHelloWorld.jnilib");  //全路径,要带上扩展名
    }    

系统会在 java.library.path 里寻找动态库(*.dll, *.so)

摘抄自:https://www.cnblogs.com/zhizaixingzou/p/10068405.html

 jclass class_nativecode = jniEvn->FindClass("cn/angelshelter/example/jni/JNITest");   正确写法

jclass class_nativecode = jniEvn->FindClass("cn.angelshelter.example.jni.JNITest");   错误写法

2024-01-26

查看安卓方法在jni中的定义: javap -s .\xxx.class

posted on 2019-11-24 15:56  angelshelter  阅读(302)  评论(0编辑  收藏  举报

导航