2Pascal-新时代的Pascal

 找回密码
 立即注册
搜索
热搜: fastreport
楼主: wang_80919
打印 上一主题 下一主题

关于 调用 JNI JAR java 的说明和注意事项,调用第 靠写不下了

  [复制链接]

0

主题

13

帖子

32

积分

新手上路

Rank: 1

积分
32
5#
发表于 2017-3-10 11:29:11 | 只看该作者
京东数码购物支持本站
关键内容查看
回复 支持 反对

使用道具 举报

0

主题

2

帖子

24

积分

新手上路

Rank: 1

积分
24
地板
发表于 2017-3-7 09:23:48 | 只看该作者
京东数码购物支持本站
怎么要回复了!
回复 支持 反对

使用道具 举报

90

主题

293

帖子

8万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
82235
板凳
 楼主| 发表于 2016-9-26 14:04:58 | 只看该作者
京东购书支持本站
可以参考的 DEMO。

BaiduLocation_百度定位_LBS_定位_5_SDK_DEMO_Add_Jar_BaiduLBS_Android5
http://2pascal.com/forum.php?mod=viewthread&tid=784&fromuid=4
(出处: 2Pascal-新时代的Pascal)


安卓 服务 的 一些 相关代码,自动启动服务或定时启动APP。
http://2pascal.com/forum.php?mod=viewthread&tid=2728&fromuid=4
(出处: 2Pascal-新时代的Pascal)


专门的 DELPHI 实现 JAVA 接口 的 DEMO。
消息注册接收 DEMO。
Java 的消息及事件的一般做法的 DELPHI 版 源码。

安卓 接口实现的事件 动态注册 接收 WIFI 变化消息 Demo
http://www.2pascal.com/forum.php ... &tid=3008&fromuid=4
(出处: 2Pascal-新时代的Pascal)


反射调用 java api
java demo
[mw_shl_code=java,true]    /**
     * VIVO
     * <p>
     * android.util.FtFeature
     * public static boolean isFeatureSupport(int mask);
     * <p>
     * 参数:
     * 0x00000020表示是否有凹槽;
     * 0x00000008表示是否有圆角。
     *
     * @param context Context
     * @return hasNotch
     */
    private static boolean hasNotchInVivo(Context context) {
    boolean hasNotch = false;
    try {
        ClassLoader cl = context.getClassLoader();
        Class ftFeature = cl.loadClass("android.util.FtFeature");
        Method[] methods = ftFeature.getDeclaredMethods();
        if (methods != null) {
            for (int i = 0; i < methods.length; i++) {
                Method method = methods;
                if (method.getName().equalsIgnoreCase("isFeatureSupport")) {
                    hasNotch = (boolean) method.invoke(ftFeature, 0x00000020);
                    break;
                }
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
        hasNotch = false;
    }
    return hasNotch;
}[/mw_shl_code]

作者:brucevanfdm
链接:https://www.jianshu.com/p/fb3efdd5b61a


delphi demo
游客,如果您要查看本帖隐藏内容请回复
(C)(P)Flying Wang
回复 支持 反对

使用道具 举报

90

主题

293

帖子

8万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
82235
沙发
 楼主| 发表于 2015-11-11 11:40:49 | 只看该作者
京东数码购物支持本站
当你使用一个 jni 对象的时候。如果是个可以显示的对象。很多时候需要:
CallInUiThread(
    procedure
    begin
      jni 代码。
    end);
有时候 还得换成 CallInUIThreadAndWaitFinishing。
只有这样 代码才不会死锁。
也就是 如果不这么写。你的 APP 就会出现 未响应。
有些不是显示的 jni 对象,也需要这样写。不过不常见。
如果你收到一个错误 CalledFromWrongThreadException,就是需要 CallInUiThread 了。

如果收到的是
Can't create handler inside thread that has not called Looper.prepare()
也是需要 CallInUiThread 了。多谢 [新会]supermay(15832782) 测试。

注意:不要将大片代码进入上述的代码块中。尽量减少相关代码。最好是用 DEBUG ,找出弹出这类错误提示的代码行。不会 DEBUG 请看书。

在 安卓的世界里,回调函数是不存在的。但是可以使用接口来做到回调。
一般这种接口 会被定义成 Listener。

当你需要继承(实现)一个 java 接口的时候,就需要查看有关代码了。
游客,如果您要查看本帖隐藏内容请回复

你会找到好多代码。
他们都是继承(实现) java 接口的好例子。

按照面向对象的说法 接口必须实现。所以上面找到的代码是必然的。
然后定义出这个类的 对象,就可以当参数在 jni 中使用了。
不过这种类型,是 delphi 的实现,所以别忘了 free。

个人建议大家好好研读【unit System.Android.Bluetooth;】。

有时候 接口提供的 回调函数 可能是在线程中运行的。
这时候你实现这个函数的时候,要注意。
UI 对象 无论是 FMX 的还是 jni 的。你都需要线程同步。

线程同步的简单方法就是。
...
//线程或回调函数里的一些代码。
TThread.Synchronize(nil, //或者 用线程自己的同步函数。 Synchronize(
        procedure
        begin
          //你的界面交互代码。
        end);
//继续线程或回调函数的代码。
...

如果是调用事件,
建议用
TThread.Queue(nil,
        procedure
        begin
          //你的事件调用。
        end);


如果你 DEBUG 中收到了 Bitmap size too big 的提示,有可能就是 该用同步,没同步造成的。
10.2 以后,不会再有这个提示。 Bitmap 支持线程中使用了。

10.2 开始,主线程和 UI 线程 为同一个线程了。
CallInUiThread 应该可以大批量的不用了。


有了以上知识,你基本上翻译 java 的代码,就不成问题了。
别说,你不会 顺序、判断、循环、函数调用。

如果你想了解一个 第三方 view 是如何显示到 FMX 中的。
可以参考 unit FMX.WebBrowser.Android 和 unit FMX.Media.Android。

另外,很多操作,都需要对应的权限,别忘了加上。

对于 4.4 以上的系统,想要访问外置存储卡。需要加上
<uses-permission android:name="android.permission.READ_MEDIA_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE"/>
这 2 个权限。
目前 IDE 没有提供。
您需要在 AndroidManifest.template.xml 文档中,自己加入,用 IDE 就能打开,找到 <%uses-permission%>,将上述权限文字加入到 这行下面就行。
但是,不保证所有机器都有效。


如果发现需要使用 安卓下面的 命令行,例如执行 su sh ping 等。
可以参考 QDac http://blog.qdac.cc 的代码,可能叫 QRuntime。
也可以参考 本群的 重启你的手机 源代码。


对于学习 翻译 安卓 java 代码为 pascal 。
最好先看 EMBT 的源代码。然后看 EMBT 的 Samples。
也可以好好看 本群的群共享。
里头好多调用 jni 的 DEMO。
(C)(P)Flying Wang
回复 支持 1 反对 0

使用道具 举报

90

主题

293

帖子

8万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
82235
楼主
 楼主| 发表于 2015-5-14 17:43:12 | 只看该作者
京东数码购物支持本站
相关工具
一种简单的 jar 转 pas 工具,不如 EMB 官方提供的 工具 强大。
JarOrClass2Pas FlyingWang V1.0.2016.426 附赠 java 转 Jar.zip
http://www.2pascal.com/forum.php?mod=viewthread&tid=891&fromuid=4
(出处: 2Pascal-新时代的Pascal)

如果你希望使用 EMB 官方工具,请打开你的 帮助,搜索 Java2OP.exe 。


RAD10RTM 加载 jar 存在 BUG
https://quality.embarcadero.com/browse/RSP-12335
QC 中有解决办法。
建议去 EMB 官网注册 EDN 账号,即可登录。
上面的  BUG 新版本已经 FIX 了。


手动翻译 JNI 的老文章
JNI 翻译 转 Delphi 的 经验 方法
http://www.2pascal.com/forum.php ... &tid=1100&fromuid=4
(出处: 2Pascal-新时代的Pascal)
(C)(P)Flying Wang
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|新时代Pascal论坛

GMT+8, 2024-6-14 12:48 , Processed in 0.064960 second(s), 19 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表