5 Star 163 Fork 1

神经猫 / scalacpptest

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
MIT

jni本地方法测试

这个演示程序是测试scala和java调用动态库,请用eclipse或者intellij打开,配置好scala环境(不知道请参考项目loaddll(gitee,github));

配置scala环境,请自行百度谷歌。example包下面为scala程序,jexample为java程序,两者调用动态库一样。

注:java测试时请移动至example目录下,scala移动到jexample下(不然两者会有冲突,请分开测试java和scala)

目录结构如下

本项目两个分支

如果满足eclipse或者intellij环境,编译正常,则直接进入步骤2,没有则从步骤1开始

步骤1 编译java和scala字节码

java编译Sample1.java(测试时注意修改包名)

javac example/Sample1.java

scala编译Sample1.scala

scalac example/Sample1.scala

步骤2-生成头文件.h

java生成.h

命令如下

javah -classpath . -jni example.Sample1 
# 必须打包,及命令目录在class文件上一级,不然调用失败 -jni参数可以省略,注意没有class结尾,不然找不到

scala生成.h,前提是配置好scala环境

linux和mac命令如下

SCALA_LIB=$SCALA_HOME/lib
SCALA_CP=$SCALA_LIB/scala-library.jar:$SCALA_LIB/scala-reflect.jar
javah -cp $SCALA_CP:. example.Sample1

windows命令如下

SCALA_LIB=%SCALA_HOME%\lib
SCALA_CP=%SCALA_LIB%\scala-library.jar;$SCALA_LIB\scala-reflect.jar
javah -cp %SCALA_CP%;. example.Sample1
注:windows会多一个.h文件

如下图linux和windows结果 windows和linux的h文件结果比较.png 请忽略example_Sample1_delayedInit__body.h 只需要example_Sample1.h(为了方便重命名Sample1.h) 编写对应的cpp文件Sample1.cpp

步骤3-编译动态库

windows请用vs编译

在目录Sample1下,用vs2103(高版本也行)打开Sample1.sln

linux 编译如下

g++ -dynamiclib -shared -fPIC  \
        -I/usr/include -I$JAVA_HOME/include -I$JAVA_HOME/include/linux \
        Sample1.cpp -o Sample1.so

mac os 编译如下

g++ -dynamiclib -shared -fPIC  \
        -I/usr/include -I$JAVA_HOME/include -I$JAVA_HOME/include/darwin \
        Sample1.cpp -o Sample1.dylib

Cmake方式,文件CMakeLists.txt

linux和mac os下使用cmake

cd Sample1
mkdir build
cd build
cmake ..
make

windows下使用cmake-gui

如图windows-cmake-gui下使用方式.png windows-cmake-gui下使用方式.png

住:目前java和scala两种方式是调用一样的动态库文件,所以觉得复杂时,选用java代码方式编写,获得编译的.h

步骤4 调用

eclipse 调用方式

按照如图配置eclipse配置动态库路径 eclipse配置动态库路径 或者 1.windows环境放进C:\Windows\System32(64位) C:\Windows\SysWOW64(32位) 2.linux放到/usr/lib或者/usr/local/lib 3.苹果暂时未知

命令行调用方式

VM arguments中加入该动态库文件的路径

1.把库放到java命令行执行的当前目录 2.如果不是, 执行命令时添加-Djava.library.path=$(pwd), $(pwd)为放置 Sample1.so(linux) or Sample1.dylib(os x) or Sample1.dll(windows)的目录

java类

java -Djava.library.path=$(pwd) -cp . example.Sample1
scala -Djava.library.path=$(pwd) -cp . example.Sample1

scala类

 SCALA_LIB_HOME=$SCALA_HOME/lib
 SCALA_CP=$SCALA_LIB_HOME/scala-library.jar:$SCALA_LIB_HOME/scala-reflect.jar
 java -Djava.library.path=$(pwd) -cp $SCALA_CP:. example.Sample1

windows下环境变量请替换$符号为%%包裹

另附上开源项目javacpp 以及封装一些预制的开源c++库

MIT License Copyright (c) 2022 神经猫 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

简介

java和scala 代码的jni教程示例 测试调用c/c++native 动态库 展开 收起
Scala 等 4 种语言
MIT
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
Scala
1
https://gitee.com/smirkcat/scalacpptest.git
git@gitee.com:smirkcat/scalacpptest.git
smirkcat
scalacpptest
scalacpptest
main

搜索帮助