Lazarus中文社区

 找回密码
 立即注册(注册审核可向QQ群索取)

QQ登录

只需一步,快速开始

Lazarus IDE and 组件 下载地址版权申明
查看: 3144|回复: 4

【請教】关于reepascal编写native api不支持multithread并发?

[复制链接]

该用户从未签到

发表于 2016-3-1 15:48:00 | 显示全部楼层 |阅读模式
本帖最后由 tigerA15 于 2016-3-1 17:24 编辑

在api里面有一個test function:
procedure jni_test(Env: pJNIEnv; this: JObject;pvSrc:jbyteArray;pvOut:jbyteArray;pvSize:jint); cdecl;
var i:integer;
var lvSrc,lvRet:TByteDynArray;
var lvSize:jsize;
var lvFlag:String;
begin
    try
    lvFlag:=inttostr(integer(pvSrc));
    except
        on e:exception do begin
          logi('ee:'+e.message);
        end;
    end;
    exit;
    //logi(lvFlag+ '  CV bytes');
    //logi(lvFlag+ 'enter, do nonthing');
    JNI_Enter();
    //logi(lvFlag+ '  try to cv .');
    try
      //lvSrc:= JNI_JByteArrayToBytes(Env, pvSrc);
      //logi(lvFlag+ '  cv done .');
      //setlength(lvSrc,0);
      sleep(10);
    finally
       JNI_Leave();
      // logi('leave.');
    end;
    {lvFlag:=inttostr(integer(pvSrc));
    logi(lvFlag+ '  CV bytes');
    lvSrc:= JNI_JByteArrayToBytes(Env, pvSrc);
    logi(lvFlag+ '  CV bytes 1');
    lvRet:= JNI_JByteArrayToBytes(Env, pvOut);
    logi(lvFlag+ '  CV bytes 2');
     for i:=0 to pvSize-1 do begin
         lvRet:=lvSrc+1;
     end;
     lvSize := Env^^.GetArrayLength(env, pvOut);
     Env^^.SetByteArrayRegion(env,pvOut,0,lvSize,@lvRet[0]);
     }
end;   


其實什么也沒做,然后在android層面開5個線程并發調用之:
public static native void test(byte[] pvSrc,byte[] pvOut,int pvSize);

final byte[] lvSrc=new byte[]{1,2,3,4};
                for (int i=0;i<5 ;i++){
                        new Thread(new Runnable() {                                
                                @Override
                                public void run() {
                                        byte[] lvRet=new byte[lvSrc.length];
                                        for (int i=0;i<500;i++){
                                        ImageCompare.test(lvSrc, lvRet, lvSrc.length);
                                        Log.i("",""+lvRet[3]);
                                        }
                                }
                        }).start();
                }

然而就會直接退出毫無提示及exception log,或logcat里面提示libc錯誤:

Fatal signal 11 (SIGSEGV) at 0x00010008 (code=1), thread 10658 (Thread-7144)

請問有什么解決方法?




回复

使用道具 举报

该用户从未签到

 楼主| 发表于 2016-3-1 15:48:17 | 显示全部楼层
@chenyuchih
@delphicn
回复 支持 反对

使用道具 举报

该用户从未签到

 楼主| 发表于 2016-3-1 15:50:11 | 显示全部楼层
然而,改为单一调用就可以,即使将其放在子线程中运行。
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2016-3-6 02:34:27 | 显示全部楼层
剛好最近在英文官網上有人發了這篇
http://forum.lazarus.freepascal.org/index.php/topic,31437.msg204308.html#msg204308

如果換個方式,從原生碼內跑多執行緒有沒有可能?
不好意思,我對多緒程式的設計僅有個粗淺的概念,如果講得比較不著邊際還請指正
回复 支持 反对

使用道具 举报

该用户从未签到

 楼主| 发表于 2016-3-8 16:28:50 | 显示全部楼层
chenyuchih 发表于 2016-3-6 02:34
剛好最近在英文官網上有人發了這篇
http://forum.lazarus.freepascal.org/index.php/topic,31437.msg20430 ...

還以為fp只是對於ndk支持不完美,不可能吧,可能嗎?不可能吧……。我又沒空研究這個了,公司有支Android app需要大改,下次再聊
回复 支持 反对

使用道具 举报

*滑块验证:

本版积分规则

QQ|手机版|小黑屋|Lazarus中国|Lazarus中文社区 ( 鄂ICP备16006501号-1 )

GMT+8, 2024-10-11 03:48 , Processed in 0.035978 second(s), 9 queries , Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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