JNI

Android JNI开发解决Could not get version from cmake.dir path问题

做~自己de王妃 提交于 2020-01-16 02:22:59
项目用到了JNI,在Android Studio上NDK开发用的是cmake,但是打开项目报了如下错误 Could not get version from cmake.dir path 'D:\Android\Sdk\cmake\3.10.2.4988404'. - CMake '3.6.0' found in SDK did not match requested version '3.10.2'. 字面意思就是说在cmake文件夹路径下找不到指定版本的cmake,只找到3.6.0版本不符合项目需要的3.10.2版本 找不到那就下一个呗 打开SDK Manager,切换到SDK Tools页,找到CMake项,勾选下右下角的Show Package Details后可以展开CMake看到下面的版本,可以看到3.6.4版本是installed,而3.10.2版本是Not installed,我们就勾选下3.10.2版本,然后点击OK按钮就会开始下载该版本。 下载完成后再点击下Try Again按钮重新Async Gradle,问题就解决了 来源: CSDN 作者: 野猿新一 链接: https://blog.csdn.net/mqdxiaoxiao/article/details/103989139

ERROR: jni not found or linux C compiler test faile

我的未来我决定 提交于 2020-01-15 01:02:23
在交叉編譯FFmpeg時,分別遇到以下三種錯誤: ERROR: jni not found linux C compiler test faile ‘s_addr’ in something not a structure or unionr 最後解決方法是,直接更換成FFmpeg 4.0.1版本並搭配NDK 版本 android-ndk-r14b,即可cross compiler。 来源: CSDN 作者: Kelvin_HuangJin 链接: https://blog.csdn.net/Kelvin_HuangJin/article/details/103976679

JNI使用

我们两清 提交于 2020-01-14 19:41:38
文章目录 获取枚举字段 调用构造函数 调用静态方法 调用对象方法 Java String转换为std::string std::map转换为Java HashMap Java Map转换为std::map 获取枚举字段 jclass c = env->FindClass("android/graphics/Bitmap$Config"); jfieldID id = env->GetStaticFieldID(c,"ARGB_8888", "Landroid/graphics/Bitmap$Config;"); jobject o = env->GetStaticObjectField(c, id); 调用构造函数 jclass c = env->FindClass(env, "org/stone/WebView"); jmethodID m = jni->GetMethodID(c, "<init>", "(JLjava/lang/String;Landroid/content/Context;II)V"); jobject o = env->NewObject(c, m , reinterpret_cast<intptr_t>(this), env->NewStringUTF("ThreadName", j_content, width, height)); 调用静态方法

[JNI]Accessing Arrays

别说谁变了你拦得住时间么 提交于 2020-01-14 18:01:24
分两种情况: (1)基本元素数组 (2)对象数组 (1)基本元素数组 (i)拷贝基本元素数组: JNIEXPORT jint JNICALL Java_IntArray_sumArray(JNIEnv *env, jobject obj, jintArray arr) { jint buf[10]; jint i, sum = 0; (*env)->GetIntArrayRegion(env, arr, 0, 10, buf); //arr-->buf for (i = 0; i < 10; i++) { sum += buf[i]; } return sum; } GetIntArrayRegion的第三个参数0表示arr的起始索引,第四个参数10表示要拷贝的元素个数. (ii)获取基本元素数组的指针: GetIntArrayElements/ReleaseIntArrayElements JNIEXPORT jint JNICALL Java_IntArray_sumArray(JNIEnv *env, jobject obj, jintArray arr) { jint *carr; jint i, sum = 0; carr = (*env)->GetIntArrayElements(env, arr, NULL); if (carr == NULL) { return 0

Java调用C++类库--JNI

删除回忆录丶 提交于 2020-01-14 13:02:49
JNI是Java平台中的一个重要的功能,这里我把我做的Demo总结一下,分享一下,我会把每个步骤尽量的详细的展现出来。 这里我就不讲解JNI的原理了,google,百度一下,到处都是 好了,直接来讲步骤吧, 文章最后给出了C++和Java的Demo 第一步:安装Java jdk,eclipse。 第二步,配置Java环境变量, java环境变量配置 第三步,新建一个Java应用程序,名为:TestNativeCode,包名:com.liyong.TestNativeCode,类名:TestNativeCode 第四步,在TestNativeCode类里面添加如下代码: package com.liyong.TestNativeCode; public class TestNativeCode { public native void sayHello(); public static void main(String[] args) { System.loadLibrary("NativeCode"); TestNativeCode nativeCode=new TestNativeCode(); nativeCode.sayHello(); } } 第五步,编译Java文件 1,运行-->cmd-->进入TestNativeCode项目的src目录下编译该Java类,命令

Java调用C/C++实现的DLL动态库——JNI

∥☆過路亽.° 提交于 2020-01-14 12:19:56
由于项目的需要,最近研究了java 调用DLL的方法,将如何调用的写于此,便于日后查阅: 采用的方法是JNI: Java Native Interface,简称JNI,是Java平台的一部分,可用于让Java和其他语言编写的代码进行交互。 下面是从网上摘取的JNI工作示意图: 总体说明: 先在JAVA中建立一个类,通过javac生成.class,再由javah生成.h;然后将.h复制到VC下,由VC实现具体函, 并编译通过后生成DLL,将DLL放入JAVA工程中使用,完毕。 下面说说具体步骤(含实例): 1、建java类: 装载DLL,声明要使用DLL方法,具体实现由DLL负责;代码如下: public class Java2cpp {   static   {     System.loadLibrary("javaCallcpp");   }   public native int DLL_ADD(int a,int b);    //加   public native int DLL_SUB(int a,int b);    //减   public native int DLL_MUL(int a,int b);    //乘   public native int DLL_DIV(int a,int b);     //除   public static void

基于jni实现c/c++调用jar包

扶醉桌前 提交于 2020-01-12 21:29:47
一. 准备环境 #检查jdk版本 rpm -qa |grep java #如果没有openjdk-devel包,执行: yum install java-1.7.0-openjdk-devel -y #查找JAVA_HOME rpm -ql java-1.7.0-openjdk-devel-1.7.0.241-2.6.20.0.el7_7.x86_64 #将JAVA_HOME加入环境变量 echo "export JAVA_HOME='/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.241-2.6.20.0.el7_7.x86_64'" >> /etc/profile source /etc/profile 并在/etc/ld.so.conf.d目录下,创建一个jni.conf,向其中写入: /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.241-2.6.20.0.el7_7.x86_64/jre/lib/amd64/server /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.241-2.6.20.0.el7_7.x86_64/jre/lib/amd64/ 执行ldconfig -v |grep libjava,如果有结果显示,就说明配置正确。 如果没配置好,可能会出现如下问题: Error

Android JNI(一)——NDK与JNI基础

生来就可爱ヽ(ⅴ<●) 提交于 2020-01-11 06:54:02
前言 ndk开发是高级Android 开发必备的技能,也是很多Android开发工程师难以逾越的门槛,因此,学习ndk开发已经是高级Android必备技能,所以我尝试把自己ndk开发经验记录下来,不知之处,请大家多做指教。 导读 在Android OS上开发应用程序,Google提供了两种开发包:SDK和NDK。大家都知道SDK是基于Java开发的,ndk则是基于C/C++。不过,Android 平台从一开就已经支持了C/C++了。Google从一开始就说明Android也支持JNI编程方式,也就是第三方应用完成可以通过JNI调用自己的C动态度。于是NDK就应运而生了。 你可以从Google官方查阅到有许多关于SDK的优秀书籍、文章作为参考,但是Google提供的NDK资源,相对于SDK还是比较少的。本系列文章主要是用于,自己记录自学NDK的经验,并且希望能够帮助到哪些想学习NDK的朋友。 好了,下面我们一步一步的认识SDK吧。 了解什么是ndk 为什么使用NDK NDK到SO JNI的调用 什么是NDK NDK 其中NDK的全拼是:Native Develop Kit。我们可以去官网查看 Android NDK 具体的介绍,大致意思如下图: 英文意思如下: The Android NDK is a toolset that lets you implement parts of

JNI中枚举类型作为参数

℡╲_俬逩灬. 提交于 2020-01-11 02:27:09
参考资料: 使用JNI进行Java与C/C++语言混合编程(1)--在Java中调用C/C++本地库       java native方法及JNI实例 JNI是Java Native Interface的英文缩写, 中文翻译为本地调用, 自从Java 1.1开始就成为了Java标准的一部分. C/C++是系统级的编程语言, 可以用来开发任何和系统相关的程序和类库, 但是Java本身编写底层的应用比较难实现, 使用JNI可以调用现有的本地库, 极大地灵活了Java的开发. C/C++的效率是目前最好的语言, 可以使用C/C++来实现一些实时性非常高的部分. C/C++和Java本身都是非常流行的编程语言, 一些大型软件中经常使用语言之间的混合编程. 鉴于目前网络上JNI的文章不是特别多, 我将自己的一些总结写在这里. 如有错漏, 欢迎指正! Java调用C/C++大概有这样几个步骤 编写带有native方法的Java类, 使用javac工具编译Java类 使用javah来生成与native方法对应的头文件 实现相应的头文件, 并编译为动态链接库(windows下是.dll, linux下是.so) 1.简单的JNI-HelloWorld 首先我们看一下: Linux下JNI技术使用的一个简单实例 首先,实现的是Java本地接口Hello.java,代码如下所示: class

Android JNI, .so library 调试命令

一个人想着一个人 提交于 2020-01-09 04:15:49
/data/tombstones/tombstone_XX ============Log info============= 01-01 23:59:09.196: I/DEBUG(91): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadd00d 01-01 23:59:09.196: I/DEBUG(91): r0 00000000 r1 00f92310 r2 00000000 r3 00000000 01-01 23:59:09.196: I/DEBUG(91): r4 deadd00d r5 40aadc78 r6 0000020c r7 5287794c 01-01 23:59:09.196: I/DEBUG(91): r8 4bf7b940 r9 4bf7be50 10 0106c080 fp 01132bc0 01-01 23:59:09.196: I/DEBUG(91): ip 00000000 sp 528776e0 lr 40a45f8f pc 40a45f8e cpsr 60000030 01-01 23:59:09.326: I/DEBUG(91): #00 pc 00050f8e /system/lib/libdvm.so (dvmAbort) 01-01 23:59:09.326: