范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

JNI函数动态注册以及示例

  新增一个cpp#include  #include   #define TAG "QLH"  //__VA_ARGS__ 代表...的可变参数 #define LogD(...) __android_log_print(ANDROID_LOG_DEBUG,TAG,__VA_ARGS__); #define LogE(...) __android_log_print(ANDROID_LOG_ERROR,TAG,__VA_ARGS__); #define LogI(...) __android_log_print(ANDROID_LOG_INFO,TAG,__VA_ARGS__);  //内部对应Java函数的具体实现 void func1(JNIEnv *env, jobject jobject1) {     LogE("dynamicNative1,动态注册") }  jstring func2(JNIEnv *env, jobject jobject1) {     LogE("dynamicNative2,动态注册")     return env->NewStringUTF("hello everybody 2"); }  //包名+类型 static const char *mClassName = "com/example/myapplication/DyRegister"; //映射到对应的Java函数以及签名 static const JNINativeMethod mMethods[] = {         {"dynamicFunc1", "()V", (void *) func1},         {"dynamicFunc2", "()Ljava/lang/String;", (void *) func2} };  //实现jni.h的预定义函数,加载Java对应的函数,并且注册Native函数。这个函数内容是一个模板,修改必要参数就行 JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) {      LogE("动态注册开始")     JNIEnv *env = NULL;     //获得JNIEvn     int r = vm->GetEnv((void **) &env, JNI_VERSION_1_4);     if (r != JNI_OK) {         return -1;     }     //获取对应Java类的class     jclass mainActivityCls = env->FindClass(mClassName);     //注册,最后一个参数为注册的方法数,需要动态修改     r = env->RegisterNatives(mainActivityCls, mMethods, 2);     //如果小于0 则注册失败     if (r != JNI_OK) {         return -1;     }     LogE("动态注册结束");     return JNI_VERSION_1_4; }新增一个java文件package com.example.myapplication;  public class DyRegister {     static {         System.loadLibrary("dyTest");     }      public native void dynamicFunc1();     public native String dynamicFunc2(); }调用的地方package com.example.myapplication;  import android.os.Bundle; import androidx.appcompat.app.AppCompatActivity;  public class DyRegisterActivity extends AppCompatActivity {      @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         DyRegister register = new DyRegister();         register.dynamicFunc1();         String s = register.dynamicFunc2();         System.out.println("运行了:"+s);     } }CMake的配置# 添加lib库 add_library(dyTest SHARED DyRegister.cpp)  # 链接到日志库 如果使用android/log.h 时需要加上 target_link_libraries(dyTest ${log-lib})运行日志2023-03-27 11:50:14.422 4641-4641/com.example.myapplication E/QLH: 动态注册开始 2023-03-27 11:50:14.422 4641-4641/com.example.myapplication E/QLH: 动态注册结束 2023-03-27 11:50:14.422 4641-4641/com.example.myapplication E/QLH: dynamicNative1,动态注册 2023-03-27 11:50:14.422 4641-4641/com.example.myapplication E/QLH: dynamicNative2,动态注册 2023-03-27 11:50:14.422 4641-4641/com.example.myapplication I/System.out: 运行了:hello everybody 2

陶红挺有贵妇范,穿红色蕾丝连衣裙配卷发,丰满身材很有韵味成熟女人的穿搭和年轻女孩子当然是不一样的,到了四五十岁的年龄阶段,穿衣搭配就应该优雅知性,所以大家可以来看一看女明星陶红的穿搭,作为中年女人的她在气质这方面可是非常出众的,这一次穿刘涛新剧杀青造型吸睛,白色飘带衬衫搭配半身裙,气质很出众头条创作挑战赛刘涛的演技很不错,不少观众都喜欢看她的影视作品,尤其是霸道女总裁的戏份,刘涛更是拿捏到位。那么,剧荒的粉丝们,是不是都在期待她的新作品呢?这不,她的新剧做自己的光杀青奥尼尔晒肌肉照!50岁风采不减,新女友曝光,娇小可爱型日前,NBA传奇中锋沙奎尔奥尼尔在个人社交媒体上晒出了大量的健身照片,引起不少球迷的关注。从这些照片中不难看出,奥尼尔现在的身材管理比球员时期好太多了,肌肉线条清晰可见。球员时期的没想到佟丽娅身材这么有料?穿低胸连衣裙秀曲线,像换了个人似的虽然现在大家都觉得瘦才是美,可实际上一昧追求瘦不意味着就是美,瘦而不柴才是大家追求的身材。像佟丽娅她的身材就让非常多的人感到羡慕,这一次佟丽娅穿上着时髦的低胸连衣裙,秀出了她的纤细金卡戴珊晒美照,与一众超模争艳,42岁身材仍傲人,韵味十足金卡戴珊在社交媒体上晒出自己的美照,与一众超模争艳。照片中,金卡戴珊和一众超模们都穿着粉红色的长裙,非常的惊艳。金卡戴珊坐在C位,妥妥的主角。相比另外3位超模的长裙,金卡戴珊的长裙五帝是哪五位帝王?一文带你全面了解五帝时代与文明的形成中华文明的形成与发展经历了长期的历史过程。从一万年前开始萌芽到距今五千年的五帝时代,产生了很多新的元素。例如陶器的发明和发展原始村落的形成原始农业的产生城市雏形的出现等等,这些新元外媒美国芯片时代开始落幕了众所周知,半导体产业在上世纪五十年代起源于美国,其本土接连诞生了英特尔高通英伟达AMD等一大批领跑业内的顶尖科技巨头,美国也一直掌握着全球芯片市场的话语权。虽然美本土制造业的大举外下调业绩预期富士康称尽快恢复郑州工厂全面生产CNMO新闻众所周知,富士康是苹果主要的代工厂之一,得益于iPhone手机的热销,每年富士康都能赚得盆满钵满。不过,近期富士康郑州工厂因疫情生产受限。对此,富士康方面表示,将尽快恢在古代那个没有植发的时代古人秃了会怎么办?在现代,由于熬夜工作学习等压力,难免会出现掉发秃顶的状况,一般们会戴戴假发遮住秃了的头顶,要是家庭好一点的人可以去植发。那么在古代那个没有植发的时代,古人秃顶该怎么办?是让它一直秃1964年,赵宗礼驾登陆艇起义归来,奖600两黄金,官至少将退休1964年10月4日晚,福建沿海海面波涛汹涌,海浪一波又一波涌向岸边,拍打着海岸。突然,一艘艇身上标有1279字样的国民党海军登陆艇驶进了厦门港。艇上,站着一个中等身材的中年人,他看图学习丨让湿地公园成为人民群众共享的绿色空间湿地公约第十四届缔约方大会2022年11月5日在中国武汉和瑞士日内瓦两地拉开帷幕。这是我国首次承办湿地公约缔约方大会。大会以珍爱湿地人与自然和谐共生为主题。湿地被称为地球之肾,是全