导航:首页 > 操作系统 > jnilinuxc

jnilinuxc

发布时间:2023-03-17 22:00:06

‘壹’ linux中JNI的no HelloWorld in java library path怎么解决

我也遇到了一样的问题 折腾了好久 终于弄清楚了
先找到java.library.path的路径,用程序输出System.out.println(Syetem,getProperty("java.library.path"));
之后将libXXX.so复制到上一步输出的路径中,之后再loadLibrary(XXX)
运行后就没有问题了

‘贰’ c++的jni动态注册简单示例(上)

jni动态注册是性能最优的方案。写这个的原因是jni使用的过程中坑比较多,方便此前没有接触过的朋友快速构架开发编译环境。
如果使用jna,只需要通用的c type函数导出的dll就可以了。如果是android使用的话Android studio自带cmake,这里不多讲。

win10 vs2019 cmake-3.19 idea jdk-8( https://adoptopenjdk.net )

任意的gradle/maven工程。

源码目录下新建包com,包下新建CppNative.kt:

同样的,在com包下新建Native.java:

我们可以编译此项目,得到class文件,在class目录下:

在java/main下运行 javah -jni com.Native 得到com_Native.h:

在kotlin/main下运行 javah -jni com.CppNative 得到com_CppNative.h

这是jni静态映射需要的头文件。但是动态映射不需要这个头文件,只需要获取一些拿不准的方法签名和参数类型。由于kotlin的实现机制,可以看到kotlin object类实际上是一个单例实现,jni的c函数映射的第二个参数是jobject,而不是橘谨jclass类羡晌型。如果kotlin的object内的方法想要真正的静态实现只需加入注解: @JvmStatic external fun hello()

在java/main下运行 javap -s com.Native :

在kotlin/main下运行 javap -s com.CppNative :

使用camke的原因是便于跨平台,一般说来我们在linux、windows上都有需求。

使用vs2019(如有需要在visual studio installer上勾选“使用c++的linux开发”,调试linux cpp项目比较方便),新建cmake项目“native-do”:

vs2019默认的cmake项目是一个父CMake项目下包含一个子项目的形式,其实没有必要改,但是为了在windows:msvc和linux:gcc下能够编译同一个项目,简化项目结构,最终项目结构如下:

这里省略了vs调试方面的工作。

其中的jni.h和jni_md.h由对应的jdk文件复制而来,做动态映射的主圆派基要工作由jni.cpp完成,而native_do.cpp实现具体函数。所有文件都是utf8 LF格式。

参考 https://android.googlesource.com/platform/development/+/master/samples/SimpleJNI/jni/native.cpp

主要注意 classPathName 和 methods 两个变量,通过 classPathName 指定完整类名(包名+类名), methods 指定方法的映射关系:

native_do.h:

native_do.cpp:

在我们的CMakeLists.txt所在的目录执行;

cmake -B build -S .

cmake --build build --config Release

cmake -B build -S . -DCMAKE_BUILD_TYPE=Release

cmake --build build

这里只是简单的映射了打印字符串方法,关于jni引用参数、回调等映射方式放在下章。

‘叁’ 安卓系统用什么语言编写的

  1. android是基于linux的开源操作系统。

  2. linux是使用标准C语言开发的操作系统。

  3. android底层驱动以及操作系统内核使用C语言以及汇编开发。

  4. android操作系统本身是使用Java开发,并使用JNI调用本地的C语言库,实现操作系统底层调度。

  5. android应用是使用Java开发;同时也可以使用C/C++ native开发,但是多数时候不用用到C。所以基本上就是Java为标准开发语言。

  6. android使用了修改过的JVM(Java虚拟机)叫做dalvik虚拟机,其本质还是Java虚拟机。

  7. 所以对应每一个APP都会创建个dalvik虚拟机,也就是一个linux进程。

说复杂了,其实就是基于linux下的修改版Java虚拟机,运行java程序。

‘肆’ nx_type.h没有

因为MAC下 $(SYSROOT)/usr/include调取的是Mac的include (The problem is that the include file in /usr/include are for Mac OS X)
overstack参考
另一个参考
我的方法:
在 android.mk 的LOCAL_C_INCLUDES中去掉$(SYSROOT)/usr/include,
在application.mk中有APP_STL := gnustl_static。
完整文件如下
Android.mk:
[plain] view plainprint?
<code class="language-crystal hljs">LOCAL_PATH := <span class="hljs-variable">$(</span>call my-dir)  
  
<span class="hljs-keyword">include</span> <span class="hljs-variable">$(</span>CLEAR_VARS)  
  
LOCAL_C_INCLUDES += \  
    <span class="hljs-variable">${</span>NDK_DIR}/sources/cxx-stl/stlport \  
    <span class="hljs-variable">$(</span>JNI_H_INCLUDE)  
  
LOCAL_SHARED_LIBRARIES += \  
    libutils   
      
LOCAL_CFLAGS += -O3 -fstrict-aliasing\  
        -fexceptions -frtti\  
        -DANDROID_NDK \  
        -D_STLP_HAS_WCHAR_T \  
        -DDISABLE_IMPORTGL  
  
LOCAL_MODULE    := ddz  
LOCAL_SRC_FILES :=  Socket32.cpp    \  
            GB2Unicode.cpp  \  
            DDzData.cpp \  
            MD5Checksum.cpp \  
            biostream.cpp \  
            TaoJNI.cpp  
              
LOCAL_LDLIBS := -L<span class="hljs-variable">$(</span>SYSROOT)/usr/<span class="hljs-class"><span class="hljs-keyword">lib</span> -<span class="hljs-title">ldl</span> -<span class="hljs-title">llog</span></span>  
  
LOCAL_STATIC_LIBRARIES += -llog\  
                        -L libstlport_static.a  
  
<span class="hljs-keyword">include</span> <span class="hljs-variable">$(</span>BUILD_SHARED_LIBRARY)  
</code>  

Application.mk:
APP_ABI := armeabi armeabi-v7a

APP_CPPFLAGS += -fexceptions
APP_STL := gnustl_static
APP_CPPFLAGS += -frtti

打开CSDN,阅读体验更佳

编译Android11是遇到kernel出现fatal error: ‘linux/compiler_types.h‘ file not found
1, 在Ubuntu 20.10环境下编译Android 11代码,遇到以下错误: kernel/msm-4.19/include/uapi/linux/stddef.h:2:10: fatal error: 'linux/compiler_types.h' file not found #include <linux/compiler_types.h> ^~~~~~~~~~~~~~~~~~~~~~~~ 1 warning and 1 error generated. ...
继续访问
处理Matlab Coder, Compiler can't find "tmwtypes.h"
处理找不到"tmwtypes.h" 当我们使用MATLAB生成c代码用C++项目编译运行时 可能会出现这样的编译问题: can't find "tmwtypes.h" #include "tmwtypes.h" --> 出错位置 这是因为我们工程文件里面没有这个.h头文件 而这个头文件是在 MATLAB的安装路径 extern\include\ 文件夹下 我们可以找到这个文...
继续访问
SQLite第三课 源码编译错误以及解决
1)fts2 has a designflaw and has been deprecated2)fts1 has a designflaw and has been deprecated解决方案:解析:FTS1和FTS2都有设计的缺陷,现在已经被废弃,目前已经提供了FTS3或者FTS4,这些作为全文搜索的模块,弥补了以前的FTS1的不足。如果确定不会使用到全文搜索,可以直接...
继续访问
实战-Android 系统读取Uboot环境变量实现
系统层读取Uboot环境变量、实现
继续访问
Beego安装问题:./proc_darwin.h:1:10: fatal error: 'sys/types.h' file not found
问题 在我按照官网的说明安装beego工具时,发生了以下错误 $ go get github.com/beego/bee # github.com/beego/bee/vendor/github.com/derekparker/delve/proc In file included from go/src/github.com/beego/bee/vendor/github.com/derekp...
继续访问

RT-Thread 编译I.MX RT1052时出现无法找到sys/types.h
..\..\..\components\dfs\include\dfs_fs.h(16): error: #5: cannot open source input file "sys/types.h": No such file or directory 下载RTT官方的Gitee上面的LTS版本3.1.3.之后进行编译出现此问题。发现之后尝试编译STM32的程序并没有出现此问题,粗略看一下源码是libc部分出现的,此部分和DFS的存储有直接关系,但是在网上并没有找到解决方案,感觉可能是电脑的libc库缺少
继续访问
Windows和Mac下获取(当前)进程内存占用
Windows下获取进程内存占用 #include <process.h> using namespace std; QString getProcessMemory() { QProcess p; int PIDNum = getpid(); p.start("tasklist /FI \"PID EQ " + QString::number(PIDNum) + " \""); p.waitForFinished(); QString result
继续访问
全志TinaLinux编译错误fatal error: unicode/ucnv.h: No such file or directory
今天开始正式干活了 拿到一个全志Tina的板子还有一个SDK压缩包,要求我这周(只剩一天半。。。)就要把sdk编译通过并且把板子跑起来。 还特别跟我说他们试了下这个sdk编译没法通过,会报错。。。 竟然是有坑! ———————————————————————————————————————————————————————————————— 准备工作: 拷贝解压SDK 阅读Guide手...
继续访问
icu 字符串编码探测及字符串编码转换实例
编译: g++ -o x x.cpp -licuuc -licui18n 请大家确认是否安装icu库 #include #include #include #include #include #define BUF_MAX 4096 /* * data, 传入参数, 需要探测的字符串 * len, 传入参数, 探测字符串长度 * detected
继续访问
linux内核编译报错问题code/include/uapi/linux/types.h:5:10: fatal error: asm/types.h: 没有那个文件或目录
Linux内核编译报错解决办法
继续访问
最新发布 使用SDK中交叉编译工具链clang时,找不到头文件并且找不到/usr/include、/usr/local/include文件夹
使用SDK中交叉编译工具链clang时,找不到头文件并且找不到/usr/include、/usr/local/include文件夹 可使用clang++ -E -x c++ - -v < /dev/null命令查看路径状态
继续访问

/usr/include/sys/types.h基本系统数据类型
https://blog.csdn.net/Rong_Toa/article/details/79254677
继续访问
找不到sys/types.h文件
准备下载sys/types.h
继续访问
<asm/types.h>在哪里
在linux中包含头文件时,有不少类似如下的写法:#include,但在linuxkernle的include文件夹下并没有这个文件夹,倒是有不少以asm打头的文件夹,如:asm_powerpc、asm_ppc等。 #include,是由Makefile根据.config内核配置自动生成的,而用make menuconfig 可以生成.config. 用make mrproper 可以清除.c
继续访问
热门推荐 Linux编程#include <sys/types.h>等一些头文件在哪里
在Linux下编写C程序的时候,对于头文件的包含会经常有 #include #include 等等这样的引用。 但是这些文件在哪里呢?  查找发现  一般在/usr/include这个目录下。这是gcc的默认头文件目录 对于子文件夹会在文件名前面加上子文件的名字这就是为什么会出现 sys/types.h的原因了
继续访问
android 动态库 如何编译<sys/types.h>,音视频学习之NDK交叉编译基础
我收集了一些学习用的资料,其中包含了很多学习,面试,中高进阶fluuter资料,还有很多视频详解,如果有同学想进一步了解,详情请看文末。也欢迎各路大神门前来装X。交叉编译交叉编译就是程序的编译环境和实际运行环境不一致,即在一个平台上生成另一个平台上的可执行代码。比如NDK,你在Mac、Win或者Linux上生成的C/C++的代码要在Android平台上运行,就需要使用到交叉编译了。通俗点说就是你的...
继续访问
JNI
Mac
Android NDK

‘伍’ java jni 怎么在windows环境中编译成linux下的so文件

可以直接在android工程下使用,因为android就是linux内核。

‘陆’ 为什么java调用jni在linux下通过,但是没在xp下通过我只是说java,不是android。

有没有详细点的错误?
一般情况,如果一个平台通桐樱前过,另颂则一个平台通不过主要有两方面原因
1,c代码实现时调用了平台特有的api,局清如linux下面有fork等系统调用,而xp就没有
2,如果程序没问题,则可能是配置不对。就是动态库放置的路径不对

‘柒’ Linux环境下java调用C

你的JNI 写错了吧

java里的 char和 C的char完全不是一回事

java里你要写 stringjava_encryptpswd(string Password, string EncryptedKey );

生成的 C头文件,应该是 jstring java_encryptpswd(JEnvi* pEnvi,jstring Password,jstring EncryptedKey)

我手写的,没查资料握仿尺,大概是这样。。

然后第一个参数是当大行前虚拟机事例,里面有很多可用的函数

后面两个是java里字符串结构,在C里面的表示法, 其实它就是指针而已。

然后你可以用pEnvi里的函数,将java的string,转化成 c的string。

然后调用 C的头文件的函数,得到结果,在组装成java的字符串。

比如段高例子:

我要用C来实现 java的字符串定位。

No.1 定义java的本地接口
public native String NAConvert(String arg1,String arg2);

No.2 生成头文件
JNIEXPORT jstring JNICALL Java_com_test_mainandroid_MainAndroidNative_NAConvert
(JNIEnv *, jobject, jstring, jstring);

No.3 自己创建一个实现文件,实现上面函数
jstring Java_com_test_mainandroid_MainAndroidNative_NAConvert
(JNIEnv* env, jobject obj, jstring arg1, jstring arg2)
{
jsize len = env->GetStringLength(arg1);
jchar* pBuf = new jchar[len+1];
env->GetStringRegion(arg1,0,len,pBuf);

jclass m = env->FindClass("java/lang/String");

jmethodID mid = env->GetMethodID(m,"charAt","(I)C");

jchar c = env->CallCharMethod(arg1,mid,1);

return arg1 ;
}

第一个是虚拟机事例指针,第二个参数是接口方法所在对象的 this。
第三个及以后才是你的接口的参数。
java里传入的所有对象参数,在C里面都是句柄。必须要用第一个参数env才能解析其中含义。

阅读全文

与jnilinuxc相关的资料

热点内容
如何在文件夹中显示创建日期 浏览:593
淮南程序员接私活项目 浏览:482
怎样加密自己的密码 浏览:527
安卓怎么关权限保护隐私 浏览:390
海牛微视app怎么用 浏览:70
单片机怎样选变压器 浏览:829
癌症pdf 浏览:725
云服务器镜像批量部署环境 浏览:683
安卓手机浏览器能访问什么网站 浏览:254
找不到网站的服务器ip地址该如何解决 浏览:743
算法十个数降序排列 浏览:95
基于单片机的老年人健康监测系统 浏览:706
python入门经典pdf下载 浏览:17
东芝变频2p空调压缩机 浏览:227
自家wifi怎么能加密 浏览:644
红米k40加密门禁卡 浏览:847
什么样的源码好看 浏览:156
手机主服务器有什么用 浏览:612
程序编写命令 浏览:597
android发送心跳包 浏览:385